我试图根据PHP中给出的一个示例代码创建一个加密字符串,我的主要问题是节点。jscrypto
模块不接受长度超过32字节的密钥,但PHPopenssl\u encrypt
接受,这似乎就是我收到无效密钥大小错误的原因。
以下是我的js代码:
let iv = sha1(await HelpersService.makeRandomNumber(null, null, 16));
iv = iv.substr(0, 16);
const text = bundledData;
const password = sha1(this.credentials.appSecret);
let salt = sha1(await HelpersService.makeRandomNumber(null, null, 4));
salt = salt.substr(0, 4);
const key = crypto.createHash('sha256').update(password + salt).digest('hex');
const cipher = crypto.createCipheriv('aes-256-cbc', key, iv);
let encoded = cipher.update(text, 'utf8', 'hex');
encoded += cipher.final('hex');
这是PHP示例:
function generateCashOutAPIHashKey($app_secret ){
//remove plus(+) sign from gsm number.
$data = 'text';
$iv = substr(sha1(mt_rand()), 0, 16);
$password = sha1($app_secret);
$salt = substr(sha1(mt_rand()), 0, 4);
$saltWithPassword = hash('sha256', $password . $salt);
$encrypted = openssl_encrypt("$data", 'aes-256-cbc', "$saltWithPassword", null, $iv );
return $encrypted;
}
有人对以下内容有疑问吗?
加密。createHash('sha256')。更新(密码salt)。摘要('hex')。substr(0,32);
我理解需要由sha256生成的32字节值的意图,但如果您对字符串进行十六进制编码,然后获取字符串的前32个字符,则会显著降低该值。现在有一个32个字符长的字符串,每个字符只有16个可能的值(0-9a-f)。您确实需要一个32字节的值,每个字节有256个可能的值。您已将加密密钥的密钥安全性从预期的256^32(1.1E77)更改为16^32(3.4E38)。
加密。createHash('sha256')。更新(“”)。摘要(“十六进制”)
“e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855”加密。createHash('sha256')。更新(“”)。摘要('hex')。substr(0,32)
“e3b0c44298fc1c149afbf4c8996fb924”
找到一种使用SHA256生成的字节值的方法。
PHP和NodeJS代码中生成的密钥长度为64字节。使用的加密AES-256需要一个32字节的密钥。在PHP代码中,openssl\u encrypt()
隐式地将64字节的密钥缩短为32字节。在NodeJS代码中,必须明确执行以下操作:
const key = crypto.createHash('sha256').update(password + salt).digest('hex').substr(0, 32);
此外,openssl_encrypt()
返回默认编码的密文Base64。在NodeJS代码中,返回的结果是十六进制编码的。在这里,您必须在更新()和最终()调用中将输出编码从'hex'
更改为'bas64'
:
let encoded = cipher.update(text, 'utf8', 'base64');
encoded += cipher.final('base64');
请注意,PHP参考代码存在多个漏洞:
mt_rand()
不是加密安全的伪随机数生成器(CSPRNG)。PHP提供加密安全的方法来派生随机IV/salt,例如random\u bytes()
或random\u int()
我在Erlang中加密AES 256位CBC然后用c代码解密它时遇到了一个问题。而加密/解密在Erlang和C中有效,但不能从一个到另一个。 和 c 代码 我得到的错误是 当我在Erlang中解密时,它可以正常工作,当我在C中加密时,它也可以使用相同的Key和IV。它是否是密码模式不匹配。虽然在我看来是正确的。任何指针都会非常有用。谢谢。 我算出,同样的数据我用C加密和解密,然后进行十六进制转储。
我希望有一个用C编写的程序,可以在没有openssl这样的大型库的帮助下,用AES-CBC对字符串进行编码/解码。 目标: 使用密码短语对字符串进行编码/解码: 因此,应用程序需要接受3个输入参数。。。 输入字符串(待编码)/或已编码字符串(待解码) 用于编码/解码字符串的密码 编码或解码指示器 我对C语言不熟悉(我可以用C#编码)。 我已经找到了https://github.com/kokke/
我做了一个简单的文件加密/解密器。它将模式和要操作的文件作为参数。加密时,它生成随机字符串并使用该字符串加密文件。解密文件时,它会提示用户输入密码,并在解密时使用该密码。 我的问题是,解密时得到的不是明文,而是胡言乱语,尽管我小心翼翼地将相同的密钥写入输入。 非常感谢James K Polk提供的加密/解密代码!
目前,我正在使用以下OpenSSL命令加密敏感文件: 以及解密: 到目前为止,这一切都很好,但由于我对加密和密码学没有太多经验,所以我想了解一下这是否是最好的方法。 我是否正确加密/解密文件?这样我是否充分利用了AES-256?我是否在这里做了一些可能会影响加密文件安全性的错误操作? 非常感谢评论/回复。 丹尼尔。 PS:我不太确定这是属于超级用户还是stackoverflow,请告知。
我从Python得到一个加密的base64字符串。 格式是AES 256 CBC,但当我尝试使用Android解密时,它将解密字符串返回为nil。 这里我使用https://github.com/fukata/aes-256-cbc-example
我是密码学的新手。我的要求是对使用openssl加密/解密的文本进行解密/加密。我们在Openssl中使用的算法是aes-256-cbc。因此,我尝试在我的应用程序中实现相同的功能。到目前为止,在谷歌搜索了很多次之后,我所能做的就是。。 我的openssl命令是 我的密钥长度是32位IV是16位 Thnx...