Java三重DES加密与2个不同的键 [英] Java Triple DES encryption with 2 different keys
问题描述
public static void main(String [] args){
SecretKey k1 = generateDESkey();
SecretKey k2 = generateDESkey();
String firstEncryption = desEncryption(plaintext,k1);
String decrypt = desDecryption(firstEncryption,k2);
String secondEncryption = desEncryption(decrypt,k1);
}
public static SecretKey generateDESkey(){
KeyGenerator keyGen = null;
try {
keyGen = KeyGenerator.getInstance(DES);
} catch(NoSuchAlgorithmException ex){
Logger.getLogger(Test.class
.getName())。log(Level.SEVERE,null,ex);
}
keyGen.init(56); // key length 56
SecretKey secretKey = keyGen.generateKey();
返回secretKey;
}
public static String desEncryption(String strToEncrypt,SecretKey desKey){
try {
加密密码= Cipher.getInstance(DES / ECB / PKCS5Padding) ;
cipher.init(Cipher.ENCRYPT_MODE,desKey);
String encryptedString = Base64.encode(cipher.doFinal(strToEncrypt.getBytes()));
return encryptedString;
} catch(NoSuchAlgorithmException ex){
Logger.getLogger(Test.class
.getName())。log(Level.SEVERE,null,ex) ;
} catch(NoSuchPaddingException ex){
Logger.getLogger(Test.class
.getName())。log(Level.SEVERE,null,ex);
} catch(IllegalBlockSizeException ex){
Logger.getLogger(Test.class
.getName())。log(Level.SEVERE,null,ex);
} catch(BadPaddingException ex){
Logger.getLogger(Test.class
.getName())。log(Level.SEVERE,null,ex);
} catch(InvalidKeyException ex){
Logger.getLogger(Test.class
.getName())。log(Level.SEVERE,null,ex);
}
返回null;
}
public static String desDecryption(String strToDecrypt,SecretKey desKey){
try {
加密密码= Cipher.getInstance(DES / ECB / PKCS5PADDING) ;
cipher.init(Cipher.DECRYPT_MODE,desKey);
String decryptptedString = new String(cipher.doFinal(Base64.decode(strToDecrypt)));
return decryptptedString;
} catch(NoSuchAlgorithmException ex){
Logger.getLogger(Test.class
.getName())。log(Level.SEVERE,null,ex) ;
} catch(NoSuchPaddingException ex){
Logger.getLogger(Test.class
.getName())。log(Level.SEVERE,null,ex);
} catch(InvalidKeyException ex){
Logger.getLogger(Test.class
.getName())。log(Level.SEVERE,null,ex);
} catch(IllegalBlockSizeException ex){
Logger.getLogger(Test.class
.getName())。log(Level.SEVERE,null,ex);
} catch(BadPaddingException ex){
Logger.getLogger(Test.class
.getName())。log(Level.SEVERE,null,ex);
} catch(Base64DecodingException ex){
Logger.getLogger(Test.class
.getName())。log(Level.SEVERE,null,ex);
}
返回null;
}
我有这个错误:javax.crypto.BadPaddingException:给定最终块不正确在这段代码中尝试解密时填充:
String decryptptedString = new String(cipher.doFinal(Base64.decode(strToDecrypt )));
您可以帮我解决这个问题,还是知道使用三重DES加密数据的直接方法具有两个不同的密钥,总密钥长度为128位?我没有找到任何算法,所以我试图使用简单的DES模拟它。
为什么不使用附带的DESede算法?
所有您的DES代码实例DESede并将您的密钥生成方法更改为:
public static SecretKey generateDESkey(){
KeyGenerator keyGen = null;
try {
keyGen = KeyGenerator.getInstance(DESede);
} catch(NoSuchAlgorithmException ex){
Logger.getLogger(Test.class.getName())。log(Level.SEVERE,null,ex);
}
keyGen.init(112); //键长度112为两个键,168为三个键
SecretKey secretKey = keyGen.generateKey();
返回secretKey;
}
注意getInstance()方法现在如何提供DESede和键大小已经增加到112(三个键为168)。
从以下位置更改您的密码实例:
Cipher.getInstance( DES / ECB / PKCS5Padding);
至
Cipher.getInstance( DESede / ECB / PKCS5Padding);
您已设置。
I'm trying to encrypt data using triple DES with two different keys, so given the two keys k1 and k2 the cryptotext would be Ek1(Dk2(Ek1(plaintext))) where E is Encryption and D Decryption. I'm trying to simulate this using DES algorithm from java. Here is the code:
public static void main(String[] args) {
SecretKey k1 = generateDESkey();
SecretKey k2 = generateDESkey();
String firstEncryption = desEncryption("plaintext", k1);
String decryption = desDecryption(firstEncryption, k2);
String secondEncryption = desEncryption(decryption, k1);
}
public static SecretKey generateDESkey() {
KeyGenerator keyGen = null;
try {
keyGen = KeyGenerator.getInstance("DES");
} catch (NoSuchAlgorithmException ex) {
Logger.getLogger(Test.class
.getName()).log(Level.SEVERE, null, ex);
}
keyGen.init(56); // key length 56
SecretKey secretKey = keyGen.generateKey();
return secretKey;
}
public static String desEncryption(String strToEncrypt, SecretKey desKey) {
try {
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, desKey);
String encryptedString = Base64.encode(cipher.doFinal(strToEncrypt.getBytes()));
return encryptedString;
} catch (NoSuchAlgorithmException ex) {
Logger.getLogger(Test.class
.getName()).log(Level.SEVERE, null, ex);
} catch (NoSuchPaddingException ex) {
Logger.getLogger(Test.class
.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalBlockSizeException ex) {
Logger.getLogger(Test.class
.getName()).log(Level.SEVERE, null, ex);
} catch (BadPaddingException ex) {
Logger.getLogger(Test.class
.getName()).log(Level.SEVERE, null, ex);
} catch (InvalidKeyException ex) {
Logger.getLogger(Test.class
.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
public static String desDecryption(String strToDecrypt, SecretKey desKey) {
try {
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5PADDING");
cipher.init(Cipher.DECRYPT_MODE, desKey);
String decryptedString = new String(cipher.doFinal(Base64.decode(strToDecrypt)));
return decryptedString;
} catch (NoSuchAlgorithmException ex) {
Logger.getLogger(Test.class
.getName()).log(Level.SEVERE, null, ex);
} catch (NoSuchPaddingException ex) {
Logger.getLogger(Test.class
.getName()).log(Level.SEVERE, null, ex);
} catch (InvalidKeyException ex) {
Logger.getLogger(Test.class
.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalBlockSizeException ex) {
Logger.getLogger(Test.class
.getName()).log(Level.SEVERE, null, ex);
} catch (BadPaddingException ex) {
Logger.getLogger(Test.class
.getName()).log(Level.SEVERE, null, ex);
} catch (Base64DecodingException ex) {
Logger.getLogger(Test.class
.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
I have this error: javax.crypto.BadPaddingException: Given final block not properly padded when trying to decrypt at this line of code:
String decryptedString = new String(cipher.doFinal(Base64.decode(strToDecrypt)));
Can you help me to resolve this problem or do you know a direct method to encrypt data using triple DES with two different keys with total key length of 128 bits? I didn't find any algorithm so I tried to simulate it using simple DES.
Why not just use the included DESede algorithm?
Change all your DES code instances to DESede and change your Key Generation method to as such:
public static SecretKey generateDESkey() {
KeyGenerator keyGen = null;
try {
keyGen = KeyGenerator.getInstance("DESede");
} catch (NoSuchAlgorithmException ex) {
Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
}
keyGen.init(112); // key length 112 for two keys, 168 for three keys
SecretKey secretKey = keyGen.generateKey();
return secretKey;
}
Note how the getInstance() method is now supplied with DESede and the key size has been increased to 112 (168 for three keys).
Change your Cipher instances from:
Cipher.getInstance("DES/ECB/PKCS5Padding");
to
Cipher.getInstance("DESede/ECB/PKCS5Padding");
And you are set.
这篇关于Java三重DES加密与2个不同的键的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!