我需要正确加密文本(特定密码),以便第三方可以解密它 . 他们为我提供了他们用来解密的密钥,并告诉我他们将使用OpenSSL解密它 .
我一直在尝试使用AESManaged和System.Security.Cryptography中的RijndaelManaged类来创建可解密但不是非常成功的东西 .
他们提供的OpenSSL加密示例如下:
echo“密码”| enc -base64 -aes-256-cbc -k“providedKey”-p -md sha1
所以我需要创建一个CryptoStream,它是一个密钥大小为256的AES加密器,以及一个CBC的密码模式 . 然后base64编码生成的字节数组 . 那部分非常简单 .
我不确定如何创造是关键,我正在寻找正确方向的一点 .
我注意到在OpenSSL中由这些参数创建的所有base64解码文本都以相同的8个字符“Salted__”开头 . 所以我猜这是用来生成密钥的Salt .
任何人都知道如何使用私钥和“Salted__”创建SHA1密钥?
我知道OpenSSL.Net项目包装了OpenSSL dll,但是如果可能的话我想避免走那条路 .
2 回答
感谢GregS's Point in the right direction,很容易复制EVP_BytesToKey()中发生的Key和Initial Vector生成 .
基本上他们创建了一个48字节的数组(用于密钥的32字节数组和用于IV的16字节数组),并使用SHA1将私钥和8个盐字节散列到该缓冲区中 . 第一个哈希只是私钥和盐,连续哈希是生成的最后一个哈希,它与密钥和盐字节连接起来,直到48字节数组被填满 .
密钥只是前32个字节,IV是最后16个字节 .
使用System.Security.Crytpography中的AESManaged类以及从此方法派生的密钥和IV,我能够以使用OpenSSL库的第三方可以解密的方式加密我的密码 .
这是我用来导出密钥和初始向量的算法:
我在相关的openssl源(
apps/enc.c
)中略微探讨了一下,我认为openssl使用了一种有点专有的方法 . 我承认我懒得弄清楚所有的细节,但他们在那里 . 看起来ASCII字符串"Salted__"后跟8个随机盐字节被添加到文件中 . AES密钥和AES iv使用名为EVP_BytesToKey()的openssl方法从密码和salt派生 . 该手册中描述了该算法 . 在版本1.0.0a的enc.c
source code中,此部分从第510行开始 .希望这可以帮助你入门 .