2012-01-27 18 views
2

のJava DESEDEの暗号化、OpenSSLの相当

私はJavaでDESEDEのencryptationを使用していると私はC++でのOpenSSLのAPIを使用して同じ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

+0

私は新しいJabberクライアントで作業しています。古いクライアントとの互換性を守る必要があります。 – Chris

+1

C++コードで単一のDESを使用しています。 –

答えて

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や何らかの整合性の証明を使用してください。 –

+0

こんにちはowlstead、私はアルゴリズムが安全ではないことを知っていますが、私は古いバージョンとの互換性のために必要です。ありがとうございました。 – Chris

+0

C/C++で最後の例をテストし、最初の8バイトはJava暗号化と同じですが、次の8バイトは同じではありません:out:0x5e 0xd3 0x40 0x97 0x63 0xc9 0x63 0xd6 0x2e 0x3d 0xa6 0xf6 0xb0 0x09 0xd7 0x19 –

1

3つの別個のキーを使用するのではなく、DES_ecb3_encryptを試してみてください。

+0

こんにちはowlstead、私は自分のC++コードを変更しました。あなたは新しいコードを質問で見ることができますが、うまくいきません。 – Chris

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