繁体   English   中英

使用phpseclib AES加密字符串

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM