Java DESede加密,相当于OpenSSL

Java DESede encrypt, OpenSSL equivalent

本文关键字:相当于 OpenSSL 加密 DESede Java      更新时间:2023-10-16

我在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,95122,72117,-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 30 110 120 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);
}              

请改用DES_ecb3_encrypt,因为您使用的是3个单独的密钥。

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