2012-01-27 91 views
2

的Java DESede加密,OpenSSL的等效

我在Java中使用DESede encryptation和我要让使用OpenSSL的API在C++相同encryptation。

Java代码:

String secretKey = "abcdefghijklmnopqrstuvwx"; 

    byte[] bytes = secretKey.getBytes("UTF-8"); 
    SecretKey key = new SecretKeySpec(bytes, "DESede"); 

    Cipher ecipher = Cipher.getInstance("DESede"); 
    ecipher.init(Cipher.ENCRYPT_MODE, key); 

    String input = "holahola1"; 

    byte[] utf8 = input.getBytes("UTF8"); 
    byte[] enc = ecipher.doFinal(utf8); // Encrypt 

输出:[94,-45,64,-105,99,-55,99,-42,95,122,72,117,-119,95%, -43,40]

C++代码:

unsigned char intext[256], outtext[256]; 

    memset(intext, 0, sizeof(intext)); 
    memset(outtext, 0, sizeof(outtext)); 

    char *output = (char *)outtext; 
    DES_key_schedule keyschedc1; 
    DES_key_schedule keyschedc2; 
    DES_key_schedule keyschedc3; 
    DES_cblock keyc1; 
    DES_cblock keyc2; 
    DES_cblock keyc3; 

    DES_string_to_key("abcdefgh", &keyc1); 
    DES_string_to_key("ijklmnop", &keyc2); 
    DES_string_to_key("qrstuvwx", &keyc3); 
    DES_set_key((DES_cblock *)keyc1, &keyschedc1); 
    DES_set_key((DES_cblock *)keyc2, &keyschedc2); 
    DES_set_key((DES_cblock *)keyc3, &keyschedc3); 

    strcpy((char *)intext, "holahola1"); 

    for (int i=0; i<16; i += 8) 
    { 
     DES_ecb3_encrypt((DES_cblock *)(intext + i), 
         (DES_cblock *)(outtext + i), 
         &keyschedc1, &keyschedc2, 
         &keyschedc3,DES_ENCRYPT); 
    }    

输出:[30 55 9 -58 -18 -65 -66 -32 123 72 30 110 120 69 101 -81]

什么错误?有人能帮我吗?谢谢!。

+0

只是好奇,为什么会有人使用DES加密? – TJD 2012-01-27 18:45:34

+0

我正在使用新的Jabber客户端,我需要保持与旧客户端的兼容性。 – Chris 2012-01-27 18:51:15

+1

您在C++代码中使用单个DES。 – 2012-01-27 23:40:03

回答

2

我明白了。 Java DESede加密,使用ecb模式的三重DES,并使用PKCS#5填充。所以,我使用PKCS#5填充我的文本,并解决所有问题。

示例C++代码:

unsigned char intext[256], outtext[256]; 

memset(intext, 0x07, sizeof(intext)); //PKCS#5 padding (See documentation) 
memset(outtext, 0, sizeof(outtext)); 
char *output = (char *)outtext; 

DES_key_schedule keyschedc1; 
DES_key_schedule keyschedc2; 
DES_key_schedule keyschedc3; 
DES_cblock keyc1; 
DES_cblock keyc2; 
DES_cblock keyc3; 

DES_set_key((DES_cblock *)"abcdefgh", &keyschedc1); 
DES_set_key((DES_cblock *)"ijklmnop", &keyschedc2); 
DES_set_key((DES_cblock *)"qrstuvwx", &keyschedc3); 

strcpy((char *)intext, "holahola1"); 

for (int i=0; i<16; i += 8) 
{ 
    DES_ecb3_encrypt((DES_cblock *)(intext + i), 
        (DES_cblock *)(outtext + i), 
        &keyschedc1, &keyschedc2, 
        &keyschedc3,DES_ENCRYPT); 
}    
+0

请注意Rossum的建议:你的算法不安全,你至少应该使用DESede/CBC/PKCS5Padding,不要忘记使用随机的IV。如果可能,请使用AES和/或某种完整性保护措施。 – 2012-01-31 18:10:15

+0

嗨,猫头鹰,我知道算法不安全,但我需要它与旧版本的兼容性。感谢您的建议。 – Chris 2012-02-01 11:27:38

+0

我已经测试了C/C++中的最后一个例子,并且看到前8个字节与Java加密相同,但接下来的8个字节不相同:out:0x5e 0xd3 0x40 0x97 0x63 0xc9 0x63 0xd6 0x2e 0x3d 0xa6 0xf6 0xb0 0x09 0xd7 0x19 – 2012-07-13 10:12:19

1

尝试使用DES_ecb3_encrypt,而不是使用3个单独的密钥。

+0

嗨,猫头鹰,我改变了我的C++代码,你可以看到问题中的新代码,但不起作用。 – Chris 2012-01-31 07:32:48

1
byte[] bytes = secretKey.getBytes("UTF-8"); 
SecretKey key = new SecretKeySpec(bytes, "**DESede/PKCS#5**");