2012-01-27 92 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**");