Java DESede加密,相当于OpenSSL

Java DESede加密,相当于OpenSSL,java,c++,encryption,openssl,des,Java,C++,Encryption,Openssl,Des,我使用java中的DESEDED加密,我希望在C++中使用OpenSSL的API进行相同的加密。 Java代码: String secretKey = "abcdefghijklmnopqrstuvwx"; byte[] bytes = secretKey.getBytes("UTF-8"); SecretKey key = new SecretKeySpec(bytes, "DESede"); Cipher ecipher = Cipher.getInsta

我使用java中的DESEDED加密,我希望在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);
    }              
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);
}              
无符号字符intext[256],outtext[256];
memset(intext,0,sizeof(intext));
memset(outtext,0,sizeof(outtext));
字符*输出=(字符*)输出文本;
DES_key_schedule key chedc1;
DES_key_schedule key chedc2;
DES_key_schedule key chedc3;
DES_cblock keyc1;
DES_cblock keyc2;
DES_cblock keyc3;
从字符串到键(“abcdefgh”和键C1);
DES_string_to_key(“ijklmnop”、&keyc2);
DES_string_to_key(“qrstuvxx”、&keyc3);
DES_set_键((DES_cblock*)键C1和键CHEDC1);
DES_set_键((DES_cblock*)键C2和键CHEDC2);
DES_set_键((DES_cblock*)键C3和键CHEDC3);
strcpy((char*)在文本中,“holahola1”);

对于(int i=0;i尝试使用DES_ecb3_加密,因为您使用的是3个单独的密钥。

尝试DES_ecb3_加密,因为您使用的是3个单独的密钥。

我知道了。Java DESede加密,使用三重DES和ecb模式,并使用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);
}              
无符号字符intext[256],outtext[256];
memset(intext,0x07,sizeof(intext));//PKCS#5填充(参见文档)
memset(outtext,0,sizeof(outtext));
字符*输出=(字符*)输出文本;
DES_key_schedule key chedc1;
DES_key_schedule key chedc2;
DES_key_schedule key chedc3;
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_键((DES_cblock*)“qrstuvxx”、&keyschedc3);
strcpy((char*)在文本中,“holahola1”);

对于(int i=0;i我知道了。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);
}              
无符号字符intext[256],outtext[256];
memset(intext,0x07,sizeof(intext));//PKCS#5填充(参见文档)
memset(outtext,0,sizeof(outtext));
字符*输出=(字符*)输出文本;
DES_key_schedule key chedc1;
DES_key_schedule key chedc2;
DES_key_schedule key chedc3;
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_键((DES_cblock*)“qrstuvxx”、&keyschedc3);
strcpy((char*)在文本中,“holahola1”);


对于(iTi=0;我只是好奇为什么有人会使用DES加密)我正在使用一个新的Jabbor客户端,我需要保护与老客户的兼容性。在C++代码中使用单DES。DESEDE有时被称为3DES。您还使用ECB,这是不安全的。您需要确保java和C++都使用更好的模式,SUC。H.C.B.H.RuSum,我确信java使用ECB模式,因为CBC模式需要一个init vector,并且DeeDE不要求我这个向量。奇怪为什么有人会用DES加密?我正在用一个新的Jabbor客户端工作,并且我需要保护与老客户端的兼容性。您在C++代码中使用单个DES。时代也被称为3DES。你也使用了不安全的ECB。你需要确保java和C++都使用更好的模式,比如CBC。Hi RuSum,我确信java使用ECB模式,因为CBC模式需要一个init vector,并且DESEDE,不要求我这个向量。嗨OWSTSTATE,我改变C++代码,你可以看到新代码在问题,但是不起作用。嗨,OWLSTATE,我改变了我的C++代码,你可以在这个问题中看到新的代码,但是不起作用。请注意RoSoMe的建议:你的算法不安全,你至少应该使用<代码>”DeEDE/CBC/PKCS5pAdP”。
,不要忘记使用随机IV。如果可能,请使用AES和/或某种完整性保护。嗨,owlstead,我知道该算法不安全,但我需要它与旧版本兼容。谢谢你的建议。我已经在C/C++中测试了最后一个示例,请参阅set first 8字节与Java加密相同,但接下来的8字节则相同不一致:OUT:0x50x0x63 0xC0x63 0xD60x20x360x660xf60xb00x0x0d70x19.示例中,我现在使用它.似乎在C++和java中填充的不相等,所以确保java使用PKCS>5请注意RoSoMy的建议:您的算法不安全,至少应该使用<代码>“DESede/CBC/PKCS5P添加"
,不要忘记使用随机IV。如果可能,请使用AES和/或某种完整性保护。嗨,owlstead,我知道该算法不安全,但我需要它与旧版本兼容。谢谢你的建议。我已经在C/C++中测试了最后一个示例,请参阅set first 8字节与Java加密相同,但接下来的8字节则相同不一致:OUT:0x5E0x400x60x60xC90x6x0xD60x20x360x660xf60xb00x0x0d70x19.示例中,我现在使用它.似乎在C++和java中填充的不相等,所以确保java使用PKCSα5