Java三重DES加密与2个不同的键 [英] Java Triple DES encryption with 2 different keys

查看:269
本文介绍了Java三重DES加密与2个不同的键的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图用两个不同的密钥对三重DES加密数据,所以给定两个密钥k1和k2,密文将是Ek1(Dk2(Ek1(明文))),其中E是加密和D解密。我试图使用来自java的DES算法来模拟这个。这是代码:

  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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆