簡體   English   中英

Java DESede加密,等效於OpenSSL

[英]Java DESede encrypt, OpenSSL equivalent

我在Java中使用DESede加密,並且想在C ++中使用OpenSSL的API進行相同的加密。

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 123 -32 72 30110120 69 101 -81]

怎么了? 有人能幫我嗎? 謝謝!。

我知道了。 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);
}              
byte[] bytes = secretKey.getBytes("UTF-8");
SecretKey key = new SecretKeySpec(bytes, "**DESede/PKCS#5**");

當您使用3個單獨的密鑰時,請嘗試使用DES_ecb3_encrypt。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM