【发布时间】: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