- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在 Erlang 中加密 AES 256 位 CBC,然后在 C 代码中解密时遇到了问题。而加密/解密在 Erlang 和 C 中有效,但不能从一个到另一个。
Ivec = "1200000000000000",
Key = "586E36EEE726B37F70A6F7B770764E99",
Data = "encrypt[38ce517c95b011bbfc999f36d09e4feb92d22dd8,38ce517c95b011bbfc999f36d09e4feb92d22222]",
PaddedText = string:left(Data ++ ",",128,$0),
%%Data is "encrypt[38ce517c95b011bbfc999f36d09e4feb92d22dd8,38ce517c95b011bbfc999f36d09e4feb92d22222],0000000000000000000000000000000000000"
EncryptedText = crypto:block_encrypt(aes_cbc256, Key, Ivec, PaddedText),
%%Send to C code
C 代码
unsigned char *key = (unsigned char *)"586E36EEE726B37F70A6F7B770764E99";
unsigned char *iv = (unsigned char *)"1200000000000000";
EVP_CIPHER_CTX *ctx;
EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv)
EVP_DecryptUpdate(ctx, plaintext, &len, buf, buf_len)
我得到的错误是
error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:539:
当我在 Erlang 中解密时,它工作正常,当我在 C 中加密时,它也可以使用相同的 key 和 IV 正常工作。是否密码模式不匹配。虽然它对我来说看起来是正确的。任何指针都会非常有用。谢谢
我发现,我在 C 中加密和解密的相同数据,然后进行了十六进制转储。 Erlang senginh 的实际加密数据为 128 字节,而由 C openssl 库加密的相同数据为 144 字节。那是正常的密文通常很长。这是输出。
加密后返回的Erlang二进制文件:
<<165,171,208,104,24,97,173,130,177,99,50,22,51,180,112,123,36,18,208,170,250,131,195,162,182,162,253,14,121,242,61,60,202,172,74,121,223,50,128,255,134,51,253,91,195,174,90,93,77,65,1,115,119,64,25,131,47,245,68,156,163,145,111,125,143,208,255,53,131,220,174,243,64,120,229,21,86,107,139,148,164,39,144,106,232,64,252,234,26,208,138,187,213,244,210,11,174,47,126,4,97,179,194,85,8,207,116,140,236,3,145,209,95,106,36,121,241,228,153,120,226,125,227,138,130,183,217,39>>
这是Erlang发送的
Encrypted = 128
a5 ab d0 68 18 61 ad 82 b1 63 32 16 33 b4 70 7b
24 12 d0 aa fa 83 c3 a2 b6 a2 fd 0e 79 f2 3d 3c
ca ac 4a 79 df 32 80 ff 86 33 fd 5b c3 ae 5a 5d
4d 41 01 73 77 40 19 83 2f f5 44 9c a3 91 6f 7d
8f d0 ff 35 83 dc ae f3 40 78 e5 15 56 6b 8b 94
a4 27 90 6a e8 40 fc ea 1a d0 8a bb d5 f4 d2 0b
ae 2f 7e 04 61 b3 c2 55 08 cf 74 8c ec 03 91 d1
5f 6a 24 79 f1 e4 99 78 e2 7d e3 8a 82 b7 d9 27
这是相同数据的 Openssl (c) 库的输出。
Encrypted = 144
a5 ab d0 68 18 61 ad 82 b1 63 32 16 33 b4 70 7b
24 12 d0 aa fa 83 c3 a2 b6 a2 fd 0e 79 f2 3d 3c
ca ac 4a 79 df 32 80 ff 86 33 fd 5b c3 ae 5a 5d
4d 41 01 73 77 40 19 83 2f f5 44 9c a3 91 6f 7d
8f d0 ff 35 83 dc ae f3 40 78 e5 15 56 6b 8b 94
a4 27 90 6a e8 40 fc ea 1a d0 8a bb d5 f4 d2 0b
ae 2f 7e 04 61 b3 c2 55 08 cf 74 8c ec 03 91 d1
5f 6a 24 79 f1 e4 99 78 e2 7d e3 8a 82 b7 d9 27
f7 01 c0 ed 95 e3 14 e5 d2 62 21 da a9 1d 2a e7
Erlang 中缺少最后 16 个字节。我需要从 Erlang Crypto 库调用任何其他 API 吗?
最佳答案
您看到的是 padding 的差异。 OpenSSL 始终使用 PKCS#7 定义的填充方案进行填充。在 Erlang 中,您在使用密码进行加密之前用零填充明文(这称为零填充)。密码本身不会填充(看起来)。
由于明文是 16 的倍数(128 位,AES 的 block 大小),一个完整的填充 block - 由十六进制的 16 个字节组成,值为 10
- 由OpenSSL 例程。
所以如果你想匹配密文你应该使用EVP_CIPHER_CTX_set_padding(0)
:
EVP_CIPHER_CTX_set_padding()
enables or disables padding. By default encryption operations are padded using standard block padding and the padding is checked and removed when decrypting. If the pad parameter is zero then no padding is performed, the total amount of data encrypted or decrypted must then be a multiple of the block size or an error will occur.
关于c - Erlang 中的 AES-256/CBC 加密和 C 中的解密不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44709193/
我只想使用这 3 种模式从 openSSL 测试 AES: key 长度为 128,192 和 256,但我的解密文本与我的输入不同,我不知道为什么。此外,当我传递一个巨大的输入长度(比如说 1024
我正在使用 CBC 求解器在 PyCharm 上解决优化问题,但一直遇到此错误: 错误:求解器 (cbc) 返回非零返回代码 (3221225781) 和 pyutilib.common._excep
Java AES/CBC/PKCS5PADDING 函数 public static String encrypt_key_data(String password, String message)
我安装了 Laravel 并将其上传到 git现在我下载了但是当我尝试进入该网站时,出现此错误: The only supported ciphers are AES-128-CBC and AES-
我对 C# 和加密比较陌生,所以请多多包涵。我正在将一些数据写入文件,我想使用 Aes (CBC) 对其进行加密,但我每天都会获取新数据,我想每周、每月、每年将所有数据写入一个文件,这取决于在内容上。
我在解密之前在 PHP 应用程序中加密的 pgcrypto 数据时遇到问题。 我尝试了 3 种加密方式: 1) mcrypt - RIJNDAEL 128 CBC 2) mcrypt - RIJNDA
Laravel 5.3(在 Windows 服务器上)我也有同样的问题。我做了所有可能的尝试:检查 .env 文件、配置、 artisan 新 key 生成、缓存:清除、配置:清除、 Composer
我目前正在使用 AES/CBC/PKCS5Padding 来加密具有 256 字节 key 大小的 Java 文件,但在搜索时我在 stackexchange PKCS#5-PKCS#7 Paddin
我使用 Composer 安装了 Laravel 5.3 的新副本,但收到此错误: The only supported ciphers are AES-128-CBC and AES-256-CBC
这是我的网络应用程序的 Laravel 5.4 设置。页面加载时重复发生一件事。因此,我无法在我的页面上获取数据。 运行时异常:唯一受支持的密码是具有正确 key 长度的 AES-128-CBC 和
我想知道在下面的代码中是否添加了 PKCS#5 填充?如果不是如何添加? $message = "insert plaintext message here"; $iv = pack('H*', '
我正在根据解释实现希尔密码 Wikipedia 但我想使用 CBC 模式来实现它,该模式表示每个 block 必须与前一个 block 进行异或,那么第一个 block 怎么样?学士学位每个 bloc
我在 PL/SQL 中有一个用于 aes256cbc(使用 PAD_PKCS5)的加密和解密函数,这似乎工作正常。 DECLARE -- https://docs.oracle.com/data
我正在从事一个 HIPAA 项目,我注意到我需要加密所有包含或可能包含私有(private)健康信息的列级数据。也就是说,我希望在 block_encryption_mode=aes-256-cbc
我正在尝试在 Linux 上开发一种安全程序。所以,我目前的计划是使用 AES128bit-CBC。我听说 OSX 基本上支持 AES 128。 Linux 上有这样的库吗? 最佳答案 libcryp
我在标准 ecb 模式下使用 nettle 的 twofish 没有问题,但是我不确定这个 cbc 模式有什么问题?解密的消息将与原始消息不匹配。 (仅出于测试目的使用一些硬编码值,如 iv)。 ht
最近项目需要选择一套对称加密算法,来满足前后端之间的加解密操作。初步打算前端使用crypto-js来实现,后端使用java本身的加密算法实现,但遇到了一个问题:java本身只支持NoPadding和
帮助,谁能给我一个 RSA/CBC 的 Java 实现? 审计署表示 RSA/ECB/PKCS1Padding 太弱,无法提交法庭。 (他实际上是在挑战 Java PKI 吗?他建议使用 AES...
我目前正在学习加密,我希望能找到更多关于我学到的东西的说明。 假设消息“100 美元应该从账户 123456 转移到 555555”是使用 aes-128-cbc 和随机 IV 加密的。我的教授说可以
我的 php 脚本和我的 c# 应用程序将相互传递一个 32 个字符长的哈希字符串,最好的模式是什么?我认为是欧洲央行,但我不确定是否使用超过 1 个区 block 就不要使用。我怎么知道 block
我是一名优秀的程序员,十分优秀!