php7 openssl_decrypt AES的ECB与CBC加解密

php7.2版本用openssl_encrypt代替mcrypt_encrypt,导致以往自己写的Aes加密类不能用。

这次项目客户端用的是 AES-128-ECB 加密,我用在线AES工具来测试,发现自己写的加解密方法得到的值不一样。而最终发现是加密的key不是16位长,导致ios客户端与服务器php的加解密不一致。后商讨key为16位长,遂问题解决。下面是 AES-128-ECB 加密类;


class Aes
{
    //密钥 须是16位
    public $key ;
 
    /**
     * 解密字符串
     * @param string $data 字符串
     * @return string
     */
    public function __construct()
    {
    	$this->key = '1234567890123456';
    }
 
    public  function decode($str)
    {
        return openssl_decrypt(base64_decode($str),"AES-128-ECB",$this->key,OPENSSL_RAW_DATA);
    }
 
    /**
     * 加密字符串
     * @param string $data 字符串
     * @return string
     */
    public  function encode($str)
    {
        return base64_encode(openssl_encrypt($str,"AES-128-ECB",$this->key,OPENSSL_RAW_DATA));
    }
 
}

若你是采用CBC加密,则还需排序$iv偏移量,如下面是AES-128-CBC加解密类:

class Aes
{
    //密钥 须是16位
    public $key ;
 
    //偏移量
    public $iv = '1234567890123456';
 
    /**
     * 解密字符串
     * @param string $data 字符串
     * @return string
     */
    public function __construct()
    {
    	$this->key = '1234567890123456';
    }
 
    public  function decode($str)
    {
        return openssl_decrypt(base64_decode($str),"AES-128-CBC",$this->key,OPENSSL_RAW_DATA, $this->iv);
    }
 
    /**
     * 加密字符串
     * @param string $data 字符串
     * @return string
     */
    public  function encode($str)
    {
        return base64_encode(openssl_encrypt($str,"AES-128-CBC",$this->key,OPENSSL_RAW_DATA, $this->iv));
    }
 
}

转载于:https://my.oschina.net/u/3403514/blog/1809008

`AES_ecb_encrypt()` 函数封装了AES算法中的ECB模式加密操作,它可以对输入的数据进行加密处理并输出加密后的数据。而解密则需要使用 `AES_ecb_decrypt()` 函数,它封装了AES算法中的ECB模式解密操作,可以对加密后的数据进行解密处理并输出解密后的数据。 使用该函数需要先引入OpenSSL库的头文件 `openssl/aes.h`,并初始化一个 `AES_KEY` 结构体,然后使用 `AES_set_encrypt_key()` 函数设置加密密钥。接下来,可以使用 `AES_ecb_encrypt()` 函数对数据进行加密处理,该函数的参数包括输入的数据、输出的数据、数据长度和加密密钥。最后,需要释放密钥,使用 `AES_cleanup()` 函数即可。 解密的过程与加密类似,不同的是需要使用 `AES_set_decrypt_key()` 函数设置解密密钥,然后使用 `AES_ecb_decrypt()` 函数对加密后的数据进行解密处理,即可输出解密后的数据。 示例代码如下: ```c #include <openssl/aes.h> #include <string.h> int main() { unsigned char plaintext[] = "Hello, world!"; unsigned char ciphertext[16], decryptedtext[16]; AES_KEY key; AES_set_encrypt_key("0123456789abcdef", 128, &key); // 设置加密密钥 AES_ecb_encrypt(plaintext, ciphertext, &key, AES_ENCRYPT); // 进行加密 AES_set_decrypt_key("0123456789abcdef", 128, &key); // 设置解密密钥 AES_ecb_decrypt(ciphertext, decryptedtext, &key, AES_DECRYPT); // 进行解密 AES_cleanup(&key); // 释放密钥 if (strcmp(plaintext, decryptedtext) == 0) { printf("Decryption successful!\n"); } else { printf("Decryption failed!\n"); } return 0; } ``` 注意:该函数只支持对固定长度的数据进行加密和解密,如果需要对变长数据进行加密和解密,需要使用其他模式,如CBC、CTR等。同时,ECB模式存在一些安全问题,不建议使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值