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

如何在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;    
        }


繁华开满天机
浏览 1308回答 3
3回答

qq_笑_17

除了Base 64编码位(您提到这是一个测试)之外,您的代码都很好,输出可能没有意义的原因可能是您显示了一个原始字节数组(对字节数组执行toString()返回其内部Java引用,而不是返回其内部Java引用的字符串表示形式)。内容)。这里有一个版本,它只是一点点清理,打印“凯尔布恩”作为解码字符串:import&nbsp;java.security.MessageDigest;import&nbsp;java.util.Arrays;import&nbsp;javax.crypto.Cipher;import&nbsp;javax.crypto.SecretKey;import&nbsp;javax.crypto.spec.IvParameterSpec;import&nbsp;javax.crypto.spec.SecretKeySpec;public&nbsp;class&nbsp;TripleDESTest&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;throws&nbsp;Exception&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;text&nbsp;=&nbsp;"kyle&nbsp;boon"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte[]&nbsp;codedtext&nbsp;=&nbsp;new&nbsp;TripleDESTest().encrypt(text); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;decodedtext&nbsp;=&nbsp;new&nbsp;TripleDESTest().decrypt(codedtext); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(codedtext);&nbsp;//&nbsp;this&nbsp;is&nbsp;a&nbsp;byte&nbsp;array,&nbsp;you'll&nbsp;just&nbsp;see&nbsp;a&nbsp;reference&nbsp;to&nbsp;an&nbsp;array &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(decodedtext);&nbsp;//&nbsp;This&nbsp;correctly&nbsp;shows&nbsp;"kyle&nbsp;boon" &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;byte[]&nbsp;encrypt(String&nbsp;message)&nbsp;throws&nbsp;Exception&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final&nbsp;MessageDigest&nbsp;md&nbsp;=&nbsp;MessageDigest.getInstance("md5"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final&nbsp;byte[]&nbsp;digestOfPassword&nbsp;=&nbsp;md.digest("HG58YZ3CR9" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getBytes("utf-8")); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final&nbsp;byte[]&nbsp;keyBytes&nbsp;=&nbsp;Arrays.copyOf(digestOfPassword,&nbsp;24); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;j&nbsp;=&nbsp;0,&nbsp;k&nbsp;=&nbsp;16;&nbsp;j&nbsp;<&nbsp;8;)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;keyBytes[k++]&nbsp;=&nbsp;keyBytes[j++]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final&nbsp;SecretKey&nbsp;key&nbsp;=&nbsp;new&nbsp;SecretKeySpec(keyBytes,&nbsp;"DESede"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final&nbsp;IvParameterSpec&nbsp;iv&nbsp;=&nbsp;new&nbsp;IvParameterSpec(new&nbsp;byte[8]); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final&nbsp;Cipher&nbsp;cipher&nbsp;=&nbsp;Cipher.getInstance("DESede/CBC/PKCS5Padding"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cipher.init(Cipher.ENCRYPT_MODE,&nbsp;key,&nbsp;iv); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final&nbsp;byte[]&nbsp;plainTextBytes&nbsp;=&nbsp;message.getBytes("utf-8"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final&nbsp;byte[]&nbsp;cipherText&nbsp;=&nbsp;cipher.doFinal(plainTextBytes); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;final&nbsp;String&nbsp;encodedCipherText&nbsp;=&nbsp;new&nbsp;sun.misc.BASE64Encoder() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;.encode(cipherText); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;cipherText; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;decrypt(byte[]&nbsp;message)&nbsp;throws&nbsp;Exception&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final&nbsp;MessageDigest&nbsp;md&nbsp;=&nbsp;MessageDigest.getInstance("md5"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final&nbsp;byte[]&nbsp;digestOfPassword&nbsp;=&nbsp;md.digest("HG58YZ3CR9" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getBytes("utf-8")); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final&nbsp;byte[]&nbsp;keyBytes&nbsp;=&nbsp;Arrays.copyOf(digestOfPassword,&nbsp;24); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;j&nbsp;=&nbsp;0,&nbsp;k&nbsp;=&nbsp;16;&nbsp;j&nbsp;<&nbsp;8;)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;keyBytes[k++]&nbsp;=&nbsp;keyBytes[j++]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final&nbsp;SecretKey&nbsp;key&nbsp;=&nbsp;new&nbsp;SecretKeySpec(keyBytes,&nbsp;"DESede"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final&nbsp;IvParameterSpec&nbsp;iv&nbsp;=&nbsp;new&nbsp;IvParameterSpec(new&nbsp;byte[8]); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final&nbsp;Cipher&nbsp;decipher&nbsp;=&nbsp;Cipher.getInstance("DESede/CBC/PKCS5Padding"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;decipher.init(Cipher.DECRYPT_MODE,&nbsp;key,&nbsp;iv); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;final&nbsp;byte[]&nbsp;encData&nbsp;=&nbsp;new &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;sun.misc.BASE64Decoder().decodeBuffer(message); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final&nbsp;byte[]&nbsp;plainText&nbsp;=&nbsp;decipher.doFinal(message); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;new&nbsp;String(plainText,&nbsp;"UTF-8"); &nbsp;&nbsp;&nbsp;&nbsp;}}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java