为了账号安全,请及时绑定邮箱和手机立即绑定

如何在Java中使用3 DES加密/解密?

如何在Java中使用3 DES加密/解密?

繁华开满天机 2019-07-20 09:34:28
如何在Java中使用3 DES加密/解密?我编写的使用3 DES在Java中编码字符串的每一种方法都不能被解密回原来的字符串。有没有人有一个简单的代码片段,只需对字符串进行编码,然后将字符串解码回原来的字符串?我知道我在这个代码的某个地方犯了一个非常愚蠢的错误。到目前为止,我一直在做这样的工作:*注意,我不会从加密方法中返回base 64文本,也不会在解密方法中返回base 64不编码,因为我试图查看我是否在谜题的base 64部分中出错。public class TripleDESTest {     public static void main(String[] args) {         String text = "kyle boon";         byte[] codedtext = new TripleDESTest().encrypt(text);         String decodedtext  = new TripleDESTest().decrypt(codedtext);         System.out.println(codedtext);         System.out.println(decodedtext);     }     public byte[] encrypt(String message) {         try {             final MessageDigest md = MessageDigest.getInstance("md5");             final byte[] digestOfPassword = md.digest("HG58YZ3CR9".getBytes("utf-8"));             final byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24);             for (int j = 0,  k = 16; j < 8;)             {                 keyBytes[k++] = keyBytes[j++];             }             final SecretKey key = new SecretKeySpec(keyBytes, "DESede");             final IvParameterSpec iv = new IvParameterSpec(new byte[8]);             final Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");             cipher.init(Cipher.ENCRYPT_MODE, key, iv);             final byte[] plainTextBytes = message.getBytes("utf-8");             final byte[] cipherText = cipher.doFinal(plainTextBytes);             final String encodedCipherText = new sun.misc.BASE64Encoder().encode(cipherText);             return cipherText;             }
查看完整描述

3 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

除了Base 64编码位(您提到这是一个测试)之外,您的代码都很好,输出可能没有意义的原因可能是您显示了一个原始字节数组(对字节数组执行toString()返回其内部Java引用,而不是返回其内部Java引用的字符串表示形式)。内容)。这里有一个版本,它只是一点点清理,打印“凯尔布恩”作为解码字符串:

import java.security.MessageDigest;import java.util.Arrays;import javax.crypto.Cipher;import javax.crypto.SecretKey;import javax.crypto.spec.IvParameterSpec;import javax.crypto.spec.SecretKeySpec;public class TripleDESTest {

    public static void main(String[] args) throws Exception {

        String text = "kyle boon";

        byte[] codedtext = new TripleDESTest().encrypt(text);
        String decodedtext = new TripleDESTest().decrypt(codedtext);

        System.out.println(codedtext); // this is a byte array, you'll just see a reference to an array
        System.out.println(decodedtext); // This correctly shows "kyle boon"
    }

    public byte[] encrypt(String message) throws Exception {
        final MessageDigest md = MessageDigest.getInstance("md5");
        final byte[] digestOfPassword = md.digest("HG58YZ3CR9"
                .getBytes("utf-8"));
        final byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24);
        for (int j = 0, k = 16; j < 8;) {
            keyBytes[k++] = keyBytes[j++];
        }

        final SecretKey key = new SecretKeySpec(keyBytes, "DESede");
        final IvParameterSpec iv = new IvParameterSpec(new byte[8]);
        final Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, key, iv);

        final byte[] plainTextBytes = message.getBytes("utf-8");
        final byte[] cipherText = cipher.doFinal(plainTextBytes);
        // final String encodedCipherText = new sun.misc.BASE64Encoder()
        // .encode(cipherText);

        return cipherText;
    }

    public String decrypt(byte[] message) throws Exception {
        final MessageDigest md = MessageDigest.getInstance("md5");
        final byte[] digestOfPassword = md.digest("HG58YZ3CR9"
                .getBytes("utf-8"));
        final byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24);
        for (int j = 0, k = 16; j < 8;) {
            keyBytes[k++] = keyBytes[j++];
        }

        final SecretKey key = new SecretKeySpec(keyBytes, "DESede");
        final IvParameterSpec iv = new IvParameterSpec(new byte[8]);
        final Cipher decipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
        decipher.init(Cipher.DECRYPT_MODE, key, iv);

        // final byte[] encData = new
        // sun.misc.BASE64Decoder().decodeBuffer(message);
        final byte[] plainText = decipher.doFinal(message);

        return new String(plainText, "UTF-8");
    }}



查看完整回答
反对 回复 2019-07-20
  • 3 回答
  • 0 关注
  • 1307 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信