【发布时间】:2016-09-04 03:56:49
【问题描述】:
好的,这是来自页面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 x 1024。(为什么?)
【问题讨论】:
-
纯文本不应该是 10x1024,他们只是创建了一个大小为 10KB 的字符串(因此为 10x1024),例如目的。 128 位密钥意味着 128 / 8 个字节 = 16 个字节,每个字符 2 个字节,相当于 8 个字符。 256 位密钥 = 32 字节 = 16 个字符(因此 abcdefghijklmnop 是 16 个字符)。我个人对您找到的那个特定库并不太熟悉 - 我更喜欢
openssl扩展而不是纯 php 库。 -
@Mjh 感谢您的评论。但是当我将其设置为 128 位时,页面中的示例会将密钥显示为 abcdefghijklmnop ......这是 128 位密钥的 16 个字符
-
不必使用这些字符。密钥也可以转换为十六进制格式(通过散列),然后可以使用相应的字节数。就个人而言,我使用的密钥总是随机创建然后散列的——使用的散列函数是根据密码的块大小选择的。加密是一头复杂的野兽,而且通常没有正确实施(训练有素的加密人员会在我发布的评论中发现错误)。在您进一步了解加密之前,我建议您使用this blog。最好从一开始就做。
-
哇,在您提供的链接中好好阅读。谢谢!
标签: php encryption phpseclib