Laravel8对称加密的规则是什么?
相关环境:PHP7.4 + Laravel8.38
需求:我现在需要写个接口给第三方使用,第三方是java语言,我打算使用对称加密AES,把加密的sign给到我就行。
使用laravel8进行AES加解密代码:
use Illuminate\Support\Facades\Crypt;
$encrypted = Crypt::encryptString('Hello world.');
$decrypted = Crypt::decryptString($encrypted);
使用上面代码,现在我想问的是,aes加密除了key还有AES-256-CBC这2个条件,那些填充方式,偏移量,输出,字符集
这些又是什么?毕竟我要告诉第三方加密规则的。
我以为你们前面讨论了半天,讨论明白了,合着看了半天还是白讨论了,先看源码
纠结
$iv = random_bytes(openssl_cipher_iv_length(strtolower($this->cipher)))
做什么?这里只是根据提供的 cipher 创建了对应长度的一个随机的 key,random_bytes 里面接受一个长度参数,创建一个指定长度的二进制字节串。后面加密的时候传给 openssl, key 来自于
config('app.key')
,cipher 也 来自于config('app.cipher')
,加密方式和密钥这不就有了。后面加密完成后,解密可能会用到的信息都给拿出来了(除了密钥), iv、原文、mac、tag,value(密文)。
换句话说,这个方法返回的 base64 编码后的内容不是密文,而是要把这个 base64 decode 后,拿到一个 JSON,这个 JSON 里面的 value 字段才是实际的密文。
现在 IV(base64 过)、密文、密钥,都有了,直接丢进去解密不就完事儿了吗。
random_bytes 的结果看起来怪怪的是吧?
为什么我们平常的 iv 是个字符串,这里确实不认识的东西?而不是平时的hex字符串?因为这是一个 byte 串,实际上 Java 那些拿到后也会转成一个 byte 数组。
iv 这个本来就应该每次都是随机的,如果你觉得那个看起来奇怪,你可以把他用 bin2hex 转一下,这也看起来就是 hex 了。
再不济,看看 decrypt 方法的实现也可以呐。