【问题标题】:3DES EDE ECB Enryption - the c++ output differ from JAVA default mode output3DES EDE ECB Enryption - c++ 输出不同于 JAVA 默认模式输出
【发布时间】:2020-08-15 03:00:26
【问题描述】:

我正在使用来自 openssl 库的 3des-ede-ebc 加密.. 结果密码使用base64编码。 但是加密的结果密码(base564 和 Hex 编码)与任何在线加密网站的结果都不同。

例如:对于 1234
我的程序输出:

十六进制:722DDADAB2AFF81A

Base64 : ci3a2rKv+Bo=

来自在线加密工具

十六进制:0685EBBC2E239F72

Base64 : BoXrvC4jn3I=

    //keys

des_cblock key1 = {0x73,0x64,0x73,0x64,0x33,0x34,0x35,0x34};

des_cblock key3 = {0x35,0x73,0x64,0x66,0x61,0x73,0x64,0x32};

des_cblock key2 = {0x33,0x32,0x73,0x64,0x73,0x33,0x33,0x34};

//Encryption

for(int incr = 0; incr < siL_Len; incr += 8)

{
 DES_ecb3_encrypt((C_Block *)(in + incr), (C_Block *)(out + incr), &ks1, &ks2, &ks3, DES_ENCRYPT);
}

我能够将我的程序结果中的密码解密为其原始值(两者都是不同的程序)。并且 base64 编码是正确的并且经过验证。

我在加密期间/之前遗漏了一些东西。可能是在加密之前完成了一些编码/填充..

3des ebc 的标准填充是什么? 还有其他预加密步骤吗? 我找不到任何关于它的信息..

谁能帮帮我..提前谢谢..

【问题讨论】:

  • 注意:noone 应该在 2020 年为 anything 使用 3DES。这非常不安全。
  • @JesperJuhl 这是三键三重 DES。它仍然被认为有点安全,因为它提供了 112 位的安全性。例如,参见NIST recommendations。所以两次赞成但有点错误,当然不是非常不安全。现在 ECB 通常是不安全的,而且 64 位的块大小通常也是一个问题。
  • 请不要使用没有明确说明的在线工具。 OpenSSL 和 Java 通常会使用 PKCS#5 填充,除非您提供链接,否则我们不知道在线工具会做什么。填充没有通用标准(但 PKCS#5 兼容的填充是最常见的)。您想要比较的 Java 代码在哪里?
  • 我没有编写与 N 相比的 java 代码。无论如何,从我检查的结果来看,他们在初始化密码时没有指定模式或填充方法。所以我猜模式和方法是默认由java交叉。对于openssl中的填充,我认为我们必须手动执行它。至少对于ecb模式。所有在线工具都提供相同的输出,但与我的不同..

标签: c++ encryption 3des tripledes ecb


【解决方案1】:

我找到了解决方案,问题在于我如何进行填充,最初我没有进行填充。然后我使用了PKCS5,但是将填充值连接到Input是错误的。

这就是我现在做填充的方式。它有效。

for(k= 0;k<PadLen;k++) sprintf((char*)(intext + InputLen +k),"%C",padValue);

paddValue 是无符号字符类型。

感谢您的帮助..

【讨论】:

    猜你喜欢
    • 2015-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    相关资源
    最近更新 更多