![](/img/trans.png)
[英]How to AES CBC encrypt using pidCrypt, then decrypt with phpseclib?
[英]Using phpseclib AES to encrypt string
好的,这是页面http://phpseclib.sourceforge.net/crypt/examples.html中的示例代码
<?php
include('Crypt/AES.php');
include('Crypt/Random.php');
$cipher = new Crypt_AES(); // could use CRYPT_AES_MODE_CBC
// keys are null-padded to the closest valid size
// longer than the longest key and it's truncated
//$cipher->setKeyLength(128);
$cipher->setKey('abcdefghijklmnop');
// the IV defaults to all-NULLs if not explicitly defined
$cipher->setIV(crypt_random_string($cipher->getBlockLength() >> 3));
$size = 10 * 1024;
$plaintext = str_repeat('a', $size);
echo $cipher->decrypt($cipher->encrypt($plaintext));
?>
在此之前,为什么行//$cipher->setKeyLength(128);
被注释掉了吗?
如果我要将密钥设置为“ 1234568790”,我应该做些什么? 因为它比上面示例(abcdefghijklmnop)中密钥的长度短得多。
最后,如果我要加密的明文很短,例如“我的名字是詹姆斯·邦德”,我还有什么需要做的吗? 因为从上面的代码来看,纯文本的长度似乎应该是10 x1024。(为什么?)
在此之前,为什么行
//$cipher->setKeyLength(128);
被注释掉了吗?
假设您通过setKey将一个17字节的密钥传递给setKey
。 您认为应该发生什么? 在1.0和2.0版本中,如果未调用setKeyLength
则将密钥空填充为24个字节(例如192位)。 但是,如果setKeyLength
,它将被截断为16个字节。 在master分支(据我所知最终将成为3.0分支)中,如果密钥长度无效,则会引发异常。 在该版本中,例如,如果要在代码的一部分中将密钥长度设置为128位,然后在代码的另一部分中实际设置密钥,则可能仍然需要调用setKeyLength
。 即。 您可以进行长度检查,或者phpseclib可以进行长度检查。
如果我要将密钥设置为“ 1234568790”,我应该做些什么? 因为它比上面示例(abcdefghijklmnop)中密钥的长度短得多。
1234568790
在技术上还不够长,无法成为有效密钥。 它的长度为80个字节。 AES支持的最小密钥为128位。 也许您应该考虑做类似setPassword('1234568790')
的setKey('1234568790')
而不是setKey('1234568790')
。 setPassword
将使用密钥派生功能从密码生成密钥。
但是,在phpseclib 1.0和2.0中, setKey
将接受它作为键。 只需将键无效即可。 主键otoh将抛出异常,因为密钥实际上不够长。
最后,如果我要加密的明文很短,例如“我的名字是詹姆斯·邦德”,我还有什么需要做的吗? 因为从上面的代码来看,纯文本的长度似乎应该是10 x1024。(为什么?)
10 * 1024仅是示例。 默认情况下,phpseclib将使用PKCS7填充来使字符串足够长。 例如。 您的字符串长21个字节(如果我算得正确的话)。 因此,如果您调用$cipher->encrypt('my name is james bond')
则chr(11)
将被phpseclib附加到纯文本11次,然后该字符串将被加密。 这是因为块算法需要使明文为块长度的倍数。 因此,密文长度为32个字节。 然后,当您调用$cipher->decrypt('...')
您将获得原始的21字节字符串。 我可以进一步详细介绍PKCS7填充,但是我想我已经回答了您的紧迫问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.