Java 3DES 实现(学术)
Java 3DES implementation (academic)
到目前为止我的代码是:
public class TripleDES {
/**
* @param args the command line arguments
* @throws java.security.NoSuchAlgorithmException
* @throws javax.crypto.NoSuchPaddingException
* @throws java.security.InvalidKeyException
* @throws javax.crypto.IllegalBlockSizeException
* @throws javax.crypto.BadPaddingException
*/
public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
//Encrypt: C = EK3(DK2(EK1(P)))
//Decrypt: P = DK3(EK2(DK1(C)))
Scanner sc = new Scanner(System.in);
//Generate key for DES
KeyGenerator keyGenerator = KeyGenerator.getInstance("DES");
SecretKey secretKey = keyGenerator.generateKey();
SecretKey secretKey2 = keyGenerator.generateKey();
SecretKey secretKey3 = keyGenerator.generateKey();
//Text Enc & Dec
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
//enter msg
System.out.print("Enter a string: ");
String x= sc.nextLine();
//enc
cipher.init(Cipher.ENCRYPT_MODE,secretKey);
byte[] message = x.getBytes();//text
byte[] messageEnc = cipher.doFinal(message);//encryption with key1
cipher.init(Cipher.DECRYPT_MODE,secretKey2);
byte[] deck2 = cipher.doFinal(messageEnc);//decryption with key2
cipher.init(Cipher.ENCRYPT_MODE,secretKey3);
byte[] messageEnc1 = cipher.doFinal(deck2);//encryption with key3
System.out.println("Cipher Text: " + new String(messageEnc1));
//dec
cipher.init(Cipher.DECRYPT_MODE,secretKey3);
byte[] dec = cipher.doFinal(messageEnc1);//decryption with key1
cipher.init(Cipher.ENCRYPT_MODE,secretKey2);
byte[] messageEnc2 = cipher.doFinal(dec);//encryption with key2
cipher.init(Cipher.DECRYPT_MODE,secretKey);
byte[] deck3 = cipher.doFinal(messageEnc2);//decryption with key3
System.out.println("Plain Text: " + new String(deck3));
}
}
我收到错误:
Exception in thread "main" javax.crypto.BadPaddingException: Given final block not properly padded. Such issues can arise if a bad key is used during decryption.
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:991)
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:847)
at com.sun.crypto.provider.DESCipher.engineDoFinal(DESCipher.java:314)
at javax.crypto.Cipher.doFinal(Cipher.java:2164)
at tripledes.TripleDES.main(TripleDES.java:45)
我的猜测是,当我在第 45 行尝试使用不同的密钥解密时出现上述错误,这是因为加密文本比生成的密钥大,但我不太确定。
谁能帮我解决问题,我想不通。
我指的是最初发布的带有 cipher
、cipher2
和 cipher3
实例的代码:问题是关于 cipher2
和 [=12= 的填充].只有cipher
可以使用PKCS5Padding
,cipher2
和cipher3
必须申请NoPadding
。
如果 secretKey
、secretKey2
和 secretKey3
的串联字节用作 3DES 密钥,则生成的密文确实与 3DES 生成的密文相同.
ECB是一个不安全的模式,顺便说一句,s。 here.
关于评论:
对于使用字符集编码的密文解码,请参见例如Problems when converting from byte array to string and back to byte array. Concerning the missing encoding specification, s. e.g. String.getBytes() in different default charsets.
到目前为止我的代码是:
public class TripleDES {
/**
* @param args the command line arguments
* @throws java.security.NoSuchAlgorithmException
* @throws javax.crypto.NoSuchPaddingException
* @throws java.security.InvalidKeyException
* @throws javax.crypto.IllegalBlockSizeException
* @throws javax.crypto.BadPaddingException
*/
public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
//Encrypt: C = EK3(DK2(EK1(P)))
//Decrypt: P = DK3(EK2(DK1(C)))
Scanner sc = new Scanner(System.in);
//Generate key for DES
KeyGenerator keyGenerator = KeyGenerator.getInstance("DES");
SecretKey secretKey = keyGenerator.generateKey();
SecretKey secretKey2 = keyGenerator.generateKey();
SecretKey secretKey3 = keyGenerator.generateKey();
//Text Enc & Dec
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
//enter msg
System.out.print("Enter a string: ");
String x= sc.nextLine();
//enc
cipher.init(Cipher.ENCRYPT_MODE,secretKey);
byte[] message = x.getBytes();//text
byte[] messageEnc = cipher.doFinal(message);//encryption with key1
cipher.init(Cipher.DECRYPT_MODE,secretKey2);
byte[] deck2 = cipher.doFinal(messageEnc);//decryption with key2
cipher.init(Cipher.ENCRYPT_MODE,secretKey3);
byte[] messageEnc1 = cipher.doFinal(deck2);//encryption with key3
System.out.println("Cipher Text: " + new String(messageEnc1));
//dec
cipher.init(Cipher.DECRYPT_MODE,secretKey3);
byte[] dec = cipher.doFinal(messageEnc1);//decryption with key1
cipher.init(Cipher.ENCRYPT_MODE,secretKey2);
byte[] messageEnc2 = cipher.doFinal(dec);//encryption with key2
cipher.init(Cipher.DECRYPT_MODE,secretKey);
byte[] deck3 = cipher.doFinal(messageEnc2);//decryption with key3
System.out.println("Plain Text: " + new String(deck3));
}
}
我收到错误:
Exception in thread "main" javax.crypto.BadPaddingException: Given final block not properly padded. Such issues can arise if a bad key is used during decryption.
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:991)
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:847)
at com.sun.crypto.provider.DESCipher.engineDoFinal(DESCipher.java:314)
at javax.crypto.Cipher.doFinal(Cipher.java:2164)
at tripledes.TripleDES.main(TripleDES.java:45)
我的猜测是,当我在第 45 行尝试使用不同的密钥解密时出现上述错误,这是因为加密文本比生成的密钥大,但我不太确定。
谁能帮我解决问题,我想不通。
我指的是最初发布的带有 cipher
、cipher2
和 cipher3
实例的代码:问题是关于 cipher2
和 [=12= 的填充].只有cipher
可以使用PKCS5Padding
,cipher2
和cipher3
必须申请NoPadding
。
如果 secretKey
、secretKey2
和 secretKey3
的串联字节用作 3DES 密钥,则生成的密文确实与 3DES 生成的密文相同.
ECB是一个不安全的模式,顺便说一句,s。 here.
关于评论:
对于使用字符集编码的密文解码,请参见例如Problems when converting from byte array to string and back to byte array. Concerning the missing encoding specification, s. e.g. String.getBytes() in different default charsets.