GVKun编程网logo

php – MCrypt rijndael-128到OpenSSL aes-128-ecb转换(php转码)

25

在这里,我们将给大家分享关于php–MCryptrijndael-128到OpenSSLaes-128-ecb转换的知识,让您更了解php转码的本质,同时也会涉及到如何更有效地C#中的PHPMCRYP

在这里,我们将给大家分享关于php – MCrypt rijndael-128到OpenSSL aes-128-ecb转换的知识,让您更了解php转码的本质,同时也会涉及到如何更有效地C#中的PHP MCRYPT_RIJNDAEL_128加密、C语言openssl aes-128-ecb加解密、ios – 对于使用CCCrypt()的AES128,密钥可以长于128位吗?、iOS与PHP/Android AES128 ECB NoPadding加密的内容。

本文目录一览:

php – MCrypt rijndael-128到OpenSSL aes-128-ecb转换(php转码)

php – MCrypt rijndael-128到OpenSSL aes-128-ecb转换(php转码)

由于Mcrypt已被弃用,我想在我的代码中使用OpenSSL,因为我们已经在我们的服务器中使用了 PHP 7.0.17并且没有告诉他们何时升级它.

某些第三方API(可能在PHP 5.x上托管并使用mcrypt)正在使用加密数据.他们提供了用于加密/解密字符串的方法.

他们是这样的

$secret = 'a0a7e7997b6d5fcd55f4b5c32611b87c' ;

public function encrypt128($str)
    {
        $block = mcrypt_get_block_size("rijndael_128","ecb");
        $pad   = $block - (strlen($str) % $block);
        $str .= str_repeat(chr($pad),$pad);

        return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128,$secret,$str,MCRYPT_MODE_ECB));
    }

public function decrypt128($str)
    {
        $str = base64_decode($str);
        $str = mcrypt_decrypt(MCRYPT_RIJNDAEL_128,MCRYPT_MODE_ECB);

        $len = strlen($str);
        $pad = ord($str[$len - 1]);

        return substr($str,strlen($str) - $pad);
    }

使用这些方法字符串small1如果加密变为v7IXp5vVaFVXXlt / MN8BVw ==

我们想在我们这边使用openssl_encrypt,这样如果我们用OpenSSL加密相同的字符串,它必须给出与Mcrypt相同的结果.我研究过使用rijndael-128模式的mcrypt ecb应该与OpenSSL aes-128-ecb兼容.

在过去的几个小时里,我一直在尝试使用自己的方法来加密使用OpenSSL提供相同结果的字符串.到目前为止,我已经到了这里

public function sslEncrypt128($str)
{
    $secret = 'a0a7e7997b6d5fcd55f4b5c32611b87c';
    return base64_encode(openssl_encrypt($str,'aes-128-ecb',OPENSSL_RAW_DATA));
}

但它产生不同的字符串SxJ3 EdaeItZx3 / EwGTUbw ==与上述输入相同.我不知道它是标志的问题还是填充,任何指针都会受到欢迎.

我在这里添加了代码以在线测试https://3v4l.org/v2J2N

提前致谢.

解决方法

在您的具体示例中,我发现通过将aes-128-ecb更改为aes-256-ecb,它会产生与传统mcrypt_encrypt相同的输出.

C#中的PHP MCRYPT_RIJNDAEL_128加密

C#中的PHP MCRYPT_RIJNDAEL_128加密

我正在尝试用C#重写这个函数.但是C#输出与PHP不匹配

PHP版本

// Encrypt data using AES128-cbc
function encrypt($data,$key,$iv) {
    $cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_128,'','cbc','');
    mcrypt_generic_init($cipher,$iv);
    $multipass = mcrypt_generic($cipher,$data);
    mcrypt_generic_deinit($cipher);
    return $multipass;
}

C#版本

public static string encrypt(string encryptionString,string iv,string key)
{
    byte[] clearTextBytes = Encoding.UTF8.GetBytes(encryptionString);
    var rijn = SymmetricAlgorithm.Create();
    rijn.KeySize = 128;
    rijn.Mode = CipherMode.CBC;
    var ms = new MemoryStream();
    var cs = new CryptoStream(ms,rijn.CreateEncryptor(Encoding.UTF8.GetBytes(key),Encoding.UTF8.GetBytes(iv)),CryptoStreamMode.Write);
    cs.Write(clearTextBytes,clearTextBytes.Length);
    cs.Close();
    var tmp = Encoding.UTF8.GetString(ms.ToArray());
    return tmp;
}

解决方法

使用PHP加密/解密:
class Cipher {
    private $key,$iv;
    function __construct() {
        $this->key = "edrtjfjfjlldldld";
        $this->iv = "56666852251557009888889955123458";
    }
    function encrypt($text) {

        $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_256,MCRYPT_MODE_CBC);
        $padding = $block - (strlen($text) % $block);
        $text .= str_repeat(chr($padding),$padding);
        $crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256,$this->key,$text,MCRYPT_MODE_CBC,$this->iv);

        return base64_encode($crypttext);
    }

    function decrypt($input) {
        $dectext = mcrypt_decrypt(MCRYPT_RIJNDAEL_256,base64_decode($input),$this->iv);
        return $dectext;
    }
}

使用C#加密/解密:

public class RijndaelSimple
    {
        const string iv = "56666852251557009888889955123458";
        const string key = "edrtjfjfjlldldld";

        static public String EncryptRJ256(string plainText)
        {
            var encoding = new UTF8Encoding();
            var Key = encoding.GetBytes(key);
            var IV = encoding.GetBytes(iv);
            byte[] encrypted;

            using (var rj = new RijndaelManaged())
            {
                try
                {
                    rj.Padding = PaddingMode.PKCS7;
                    rj.Mode = CipherMode.CBC;
                    rj.KeySize = 256;
                    rj.BlockSize = 256;
                    rj.Key = Key;
                    rj.IV = IV;

                    var ms = new MemoryStream();

                    using (var cs = new CryptoStream(ms,rj.CreateEncryptor(Key,IV),CryptoStreamMode.Write))
                    {
                        using (var sr = new StreamWriter(cs))
                        {
                            sr.Write(plainText);
                            sr.Flush();
                            cs.FlushFinalBlock();
                        }
                        encrypted = ms.ToArray();
                    }
                }
                finally
                {
                    rj.Clear();
                }
            }

            return Convert.ToBase64String(encrypted);
        }

        static public String DecryptRJ256(string input)
        {
            byte[] cypher = Convert.FromBase64String(input);

            var sRet = "";

            var encoding = new UTF8Encoding();
            var Key = encoding.GetBytes(key);
            var IV = encoding.GetBytes(iv);

            using (var rj = new RijndaelManaged())
            {
                try
                {
                    rj.Padding = PaddingMode.PKCS7;
                    rj.Mode = CipherMode.CBC;
                    rj.KeySize = 256;
                    rj.BlockSize = 256;
                    rj.Key = Key;
                    rj.IV = IV;
                    var ms = new MemoryStream(cypher);

                    using (var cs = new CryptoStream(ms,rj.CreateDecryptor(Key,CryptoStreamMode.Read))
                    {
                        using (var sr = new StreamReader(cs))
                        {
                            sRet = sr.ReadLine();
                        }
                    }
                }
                finally
                {
                    rj.Clear();
                }
            }

            return sRet;
        }

    }

C语言openssl aes-128-ecb加解密

C语言openssl aes-128-ecb加解密

openssl aes-128-ecb方式对密码进行md5后的加解密
openssl版本:1.0.2g 其他的自行验证
编译:gcc aes_128_ecb.c -o aes_128_ecb -lssl -lcrypto

执行结果:
./aes_128_ecb
passwd: 12345
strMd516: A46B755EA8F1B4DD
strBase64Encrypt: cFeeVowosk4cR5gIg7i6ZQ==
aes_128_ecb_decrypt OK
strAESDecrypt passwd is: 12345
/*********************************************
**   aes_128_ecb.c
**   encrypte decrypt the password
*********************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/aes.h>
#include <openssl/evp.h>  
#include <openssl/bio.h>  
#include <openssl/buffer.h>
#include <openssl/md5.h>

int aes_128_ecb_encrypt(char *in, char *key, char *out) {
    int ret = 0, len = 0, len1 = 0, len2 = 0;
    unsigned char *result = NULL;
    EVP_CIPHER_CTX *ctx;
    
    ctx = EVP_CIPHER_CTX_new();
    ret = EVP_EncryptInit_ex(ctx, EVP_aes_128_ecb(), NULL, (const unsigned char*)key, NULL);
    
    if (ret != 1) {
        printf("EVP_EncryptInit_ex error\n");
        EVP_CIPHER_CTX_free(ctx);
        return 0;
    }
    result = (unsigned char *)malloc(AES_BLOCK_SIZE*64);

    ret = EVP_EncryptUpdate(ctx, result, &len1, (const unsigned char*)in, strlen(in));

    if (ret != 1) {
        printf("EVP_EncryptUpdate error\n");
        EVP_CIPHER_CTX_free(ctx);
        free(result);
        return 0;
    }
    ret = EVP_EncryptFinal_ex(ctx, result + len1, &len2);
    if (ret != 1) {
        printf("EVP_EncryptFinal_ex error\n");
        EVP_CIPHER_CTX_free(ctx);
        free(result);
        return 0;
    }

    while (len < (len1+len2)) {
        out[len] = result[len];
        len++;
    }
    EVP_CIPHER_CTX_free(ctx);
    free(result);
    return (len1+len2);
}
int aes_128_ecb_decrypt(char *in, char *key, char *out) {
    int ret = 0, len = 0, len1 = 0, len2 = 0;
    unsigned char *result = NULL;
    
    EVP_CIPHER_CTX *ctx;
    ctx = EVP_CIPHER_CTX_new();
    ret = EVP_DecryptInit_ex(ctx, EVP_aes_128_ecb(), NULL, (const unsigned char*)key, NULL);
    if (ret != 1) {
        printf("EVP_DecryptInit_ex error\n");
        EVP_CIPHER_CTX_free(ctx);
        return 0;
    }
    result = (unsigned char *)malloc(AES_BLOCK_SIZE*64);

    ret = EVP_DecryptUpdate(ctx, result, &len1, (const unsigned char*)in,get_str_len(in));//不可使用strlen求取,字符串中可能含有结束符等

    if (ret != 1) {
        printf("EVP_DecryptUpdate error\n");
        EVP_CIPHER_CTX_free(ctx);
        free(result);
        return 0;
    }
    ret = EVP_DecryptFinal_ex(ctx, result + len1, &len2);
    if (ret != 1) {
        printf("EVP_DecryptFinal_ex error\n");
        EVP_CIPHER_CTX_free(ctx);
        free(result);
        return 0;
    }
    while (len < (len1+len2)) {
        out[len] = result[len];
        len++;
    }
    EVP_CIPHER_CTX_free(ctx);
    free(result);
    return 1;
} 

// base64 编码
char *base64_encode(const char *buffer, int length) {
    BIO *bmem = NULL;
    BIO *b64 = NULL;
    BUF_MEM *bptr;
    char *buff = NULL;
    
    b64 = BIO_new(BIO_f_base64());
    BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
    bmem = BIO_new(BIO_s_mem());
    b64 = BIO_push(b64, bmem);
    BIO_write(b64, buffer, length);
    BIO_flush(b64);
    BIO_get_mem_ptr(b64, &bptr);
    BIO_set_close(b64, BIO_NOCLOSE);

    buff = (char *)malloc(bptr->length + 1);
    memcpy(buff, bptr->data, bptr->length);
    buff[bptr->length] = 0;
    BIO_free_all(b64);

    return buff;
}

// base64 解码
char *base64_decode(char *input, int length) {
    BIO *b64 = NULL;
    BIO *bmem = NULL;
    char *buffer = NULL;
    buffer = (char *)malloc(length);
    memset(buffer, 0, length);
    b64 = BIO_new(BIO_f_base64());
    BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
    bmem = BIO_new_mem_buf(input, length);
    bmem = BIO_push(b64, bmem);
    BIO_read(bmem, buffer, length);
    BIO_free_all(bmem);

    return buffer;
}

int md5_16(const char *src, char *out) {
    unsigned char c[MD5_DIGEST_LENGTH];
    int i = 0;
    MD5_CTX ctx;
    MD5_Init(&ctx);
    MD5_Update(&ctx, src, strlen(src));
    MD5_Final(c, &ctx);

    for (i = 0; i < MD5_DIGEST_LENGTH / 2; i++) {
        sprintf(out+i*2, "%02X", c[i+4]);
    }
    return 1;
}

int get_str_len(const char *in) {
    int num = 0;
    if(in == NULL) {
        return 0;
    }
    while (!((*(in + num) == NULL) && (*(in + num + 1) == NULL) \
    && (*(in + num + 2) == NULL) && (*(in + num + 3) == NULL) \
    && (*(in + num + 4) == NULL)&& (*(in + num + 5) == NULL) \
    && (*(in + num + 6) == NULL)&& (*(in + num + 7) == NULL))) {
        num++;
    }
    return num;
}


int main(int argc, char const *argv[])
{
    char strAESEncrypt[1024] = {0}, strAESDecrypt[1024] = {0}, *strBase64Encrypt = NULL, *pStrBase64Decrypt = NULL, strMd516[17] = {0};
    int nAESEncryptLen = 0;
    char strKey[128] = "0123456789ABCDEF";
    char *passwd = "12345";

    md5_16(strKey, strMd516);
    printf("passwd: %s\n", passwd);
    printf("strMd516: %s\n", strMd516);
    // 加密部分
    nAESEncryptLen = aes_128_ecb_encrypt(passwd, strMd516, strAESEncrypt);
    strBase64Encrypt = base64_encode(strAESEncrypt, nAESEncryptLen);
    printf("strBase64Encrypt: %s\n", strBase64Encrypt);

    // 解密部分
    pStrBase64Decrypt = base64_decode(strBase64Encrypt, strlen(strBase64Encrypt));
    if (aes_128_ecb_decrypt(pStrBase64Decrypt, strMd516, strAESDecrypt) == 1) {
        printf("aes_128_ecb_decrypt OK\n");
        printf("strAESDecrypt passwd is: %s\n", strAESDecrypt);
    }

    return 0;
}

ios – 对于使用CCCrypt()的AES128,密钥可以长于128位吗?

ios – 对于使用CCCrypt()的AES128,密钥可以长于128位吗?

我正在使用 CCCrypt方法.

我可以使用比128bit更长的密钥吗?可以任意长吗?或者可能是128的倍数?

如果是这样,我该怎么做?

我没想到这可能,但我发现这个文字:here

Some algorithms such as AES and RSA allow for keys of different lengths,but others are fixed,such as DES and 3DES. Encryption using a longer key generally implies a stronger resistance to message recovery. As usual,there is a Trade off between security and time,so choose the key length appropriately.

AES如何允许不同的长度,它是否忽略高于128的位?

我把头发拉出来,任何帮助将不胜感激.

解决方法

AES( Advanced Encryption Standard)实际上是三个相关分组密码算法(或算法对,如果单独计算加密和解密)的集合.它们都工作在128位块(16字节)上.

最常用的是AES-128,它采用128位密钥(即16字节). AES-192采用192位密钥(24字节),AES-256采用256位密钥(32字节).

这三种算法的工作方式类似,但仍然不同(较长的密钥需要更长的时间,因为它们会对内部混淆操作进行更多的“回合”,因此密钥的所有位都会以某种方式影响密文的所有位).因此,所有这些算法的所有这些密钥都以不同方式加密和解密(即,没有与AES-128密钥完全相同的AES-256密钥).

也就是说,遗憾的是,我不知道CommonCrypto库是否支持AES的所有变体,如果是(我想的话),如何选择正确的.

iOS与PHP/Android AES128 ECB NoPadding加密

iOS与PHP/Android AES128 ECB NoPadding加密

来自: http://www.henishuo.com/ios-aes128-ecb-nopadding/

前言

谈谈AES加密,网上有很多的版本,当我没有真正在加密安全问题前,总以为百度出来某个AES加密算法就可以直接使用,实际上当我真正要做加密时,遇到了很多的坑,原来不是拿过来就能用的。写下本篇文章,记录下曾经遇到的坑,严防以后再出现同样的坑。

AES规则

原输入数据不够16字节的整数位时,就要补齐。因此就会有padding,若使用不同的padding,那么加密出来的结果也会不一样。

AES加密算法

苹果提供给我们的API只有这一个函数用来加密或者解密:

立即学习“PHP免费学习笔记(深入)”;

 CCCryptorStatus CCCrypt(    CCOperation op,        /* kCCEncrypt, etc. */    CCAlgorithm alg,        /* kCCAlgorithmAES128, etc. */    CCOptions options,      /* kCCOptionPKCS7Padding, etc. */    const void *key,    size_tkeyLength,    const void *iv,        /* optional initialization vector */    const void *dataIn,    /* optional per op and alg */    size_tdataInLength,    void *dataOut,          /* data RETURNED here */    size_tdataOutAvailable,    size_t*dataOutMoved)    __OSX_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_2_0); 
登录后复制

  • 其中第一个 CCOperation 只有两个值,要么是 kCCEncrypt 表示加密,要么是 kCCDecrypt 表示解密。
  • 第二个参数表示加密的算法,它只有以下向种类型:

 enum {    kCCAlgorithmAES128 = 0,    kCCAlgorithmAES = 0,    kCCAlgorithmDES,    kCCAlgorithm3DES,          kCCAlgorithmCAST,          kCCAlgorithmRC4,    kCCAlgorithmRC2,      kCCAlgorithmBlowfish    };typedef uint32_tCCAlgorithm; 
登录后复制

我们这里使用的是 kCCAlgorithmAES128 表示使用AES128位加密。

  • 第三个参数表示选项,这里使用的是 kCCOptionECBMode ,表示ECB:

 enum {    /* options for block ciphers */    kCCOptionPKCS7Padding  = 0x0001,    kCCOptionECBMode        = 0x0002    /* stream ciphers currently have no options */};typedef uint32_tCCOptions; 
登录后复制

  • 第四个参数表示加密/解密的密钥。
  • 第五个参数keyLength表示密钥的长度。
  • 第六个参数iv是个固定值,通过直接使用密钥即可。大家一定要注视这个参数,如果安卓、服务端和iOS端不统一,那么加密结果就会不一样,解密可能能解出来,但是解密后在末尾会出现一些\0、\t之类的。
  • 第七个参数dataIn表示要加密/解密的数据。
  • 第八个参数dataInLength表示要加密/解密的数据的长度。
  • 第九个参数dataOut用于接收加密后/解密后的结果。
  • 第十个参数dataOutAvailable表示加密后/解密后的数据的长度。
  • 第十一个参数dataOutMoved表示实际加密/解密的数据的长度。(因为有补齐)

加密算法

依赖于第三方库: GTMBase64 ,这个库已经几年没有维护了,现在还是MRC版本,要使用请到GITHUB查看使用教程,那里有ARC接入说明:

 + (NSString *)hyb_AESEncrypt:(NSString *)plainTextpassword:(NSString *)key {  if (key == nil || (key.length != 16 && key.length != 32)) {    return nil;  }    char keyPtr[kCCKeySizeAES128+1];  memset(keyPtr, 0, sizeof(keyPtr));  [keygetCString:keyPtrmaxLength:sizeof(keyPtr)encoding:NSUTF8StringEncoding];      char ivPtr[kCCBlockSizeAES128+1];  memset(ivPtr, 0, sizeof(ivPtr));  [keygetCString:ivPtrmaxLength:sizeof(ivPtr)encoding:NSUTF8StringEncoding];    NSData* data = [plainTextdataUsingEncoding:NSUTF8StringEncoding];  NSUInteger dataLength = [datalength];    int diff = kCCKeySizeAES128 - (dataLength % kCCKeySizeAES128);  unsigned long newSize = 0;    if(diff > 0) {    newSize = dataLength + diff;  }    char dataPtr[newSize];  memcpy(dataPtr, [databytes], [datalength]);  for(int i = 0; i < diff; i++) {    // 这里是关键,这里是使用NoPadding的    dataPtr[i + dataLength] = 0x0000;  }    size_tbufferSize = newSize + kCCBlockSizeAES128;  void *buffer = malloc(bufferSize);  memset(buffer, 0, bufferSize);    size_tnumBytesCrypted = 0;    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,                                        kCCAlgorithmAES128,                                        kCCOptionECBMode,                                        [keyUTF8String],                                        kCCKeySizeAES128,                                        ivPtr,                                        dataPtr,                                        sizeof(dataPtr),                                        buffer,                                        bufferSize,                                        &numBytesCrypted);    if (cryptStatus == kCCSuccess) {    NSData *resultData = [NSDatadataWithBytesNoCopy:bufferlength:numBytesCrypted];    return [GTMBase64stringByEncodingData:resultData];  }    free(buffer);  return nil;} 
登录后复制

对于加密算法,大家一定要注意,保证iOS、安卓、服务端的加密规则是一定的,建议统一使用No Padding的,这里使用No Padding是这样的:

 for(int i = 0; i < diff; i++) {    // 这里是关键,这里是使用NoPadding的    dataPtr[i + dataLength] = 0x0000;} 
登录后复制

其实所谓Padding就是指在位数不够需要补齐时,使用什么来填充,而No Padding就是使用16个0,对应0x0000.如果三端不统一,加密出来就算能解密,也会出现一些奇怪的字符,甚至会有部分乱码。

另外,这里使用的是 kCCOptionECBMode ,也就是ECB。在安卓端和PHP端,也得使用ECB。在调试过程中,发现PHP使用CBC解密不了IOS端的。于是改成了使用ECB。

解密算法

依赖于第三方库: GTMBase64 ,这个库已经几年没有维护了,现在还是MRC版本,要使用请到GITHUB查看使用教程,那里有ARC接入说明:

 + (NSString *)hyb_AESDecrypt:(NSString *)encryptTextpassword:(NSString *)key {  if (key == nil || (key.length != 16 && key.length != 32)) {    return nil;  }    char keyPtr[kCCKeySizeAES128 + 1];  memset(keyPtr, 0, sizeof(keyPtr));  [keygetCString:keyPtrmaxLength:sizeof(keyPtr)encoding:NSUTF8StringEncoding];    char ivPtr[kCCBlockSizeAES128 + 1];  memset(ivPtr, 0, sizeof(ivPtr));  [keygetCString:ivPtrmaxLength:sizeof(ivPtr)encoding:NSUTF8StringEncoding];    NSData *data = [GTMBase64decodeData:[encryptTextdataUsingEncoding:NSUTF8StringEncoding]];  NSUInteger dataLength = [datalength];  size_tbufferSize = dataLength + kCCBlockSizeAES128;  void *buffer = malloc(bufferSize);    size_tnumBytesCrypted = 0;  CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,                                        kCCAlgorithmAES128,                                        kCCOptionECBMode,                                        [keyUTF8String],                                        kCCBlockSizeAES128,                                        ivPtr,                                        [databytes],                                        dataLength,                                        buffer,                                        bufferSize,                                        &numBytesCrypted);  if (cryptStatus == kCCSuccess) {    NSData *resultData = [NSDatadataWithBytesNoCopy:bufferlength:numBytesCrypted];        NSString *decoded=[[NSString alloc]initWithData:resultDataencoding:NSUTF8StringEncoding];    return decoded;  }    free(buffer);  return nil;} 
登录后复制

解密时也得跟加密一样指定为ECB,否则解出来会出现乱码,或者末尾会出现\0、\t之类的符号。

写在最后

开发中总会遇到各种坑,网上查了很多的资料,但是终究没有说明解决的办法,而是只将自己的代码放出来。对于刚接触这方面知识的开发人员来说,是很懵懂的。甚至很多新手会觉得系统就是这样的,我也没办法。其实总会有解决办法的,关键在于与其他各端统一连调。

关注我

Swift/ObjC技术群一:324400294(已满)

Swift/ObjC技术群二:494669518

ObjC/Swift高级群:461252383(注明年限,新手勿扰)

关注微信公众号: iOSDevShares

关注新浪微博账号:标哥Jacky

标哥的GITHUB地址: CoderJackyHuang

支持并捐助

如果您觉得文章对您很有帮忙,希望得到您的支持。您的捐肋将会给予我最大的鼓励,感谢您的支持!

支付宝捐助 微信捐助

关于php – MCrypt rijndael-128到OpenSSL aes-128-ecb转换php转码的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于C#中的PHP MCRYPT_RIJNDAEL_128加密、C语言openssl aes-128-ecb加解密、ios – 对于使用CCCrypt()的AES128,密钥可以长于128位吗?、iOS与PHP/Android AES128 ECB NoPadding加密等相关内容,可以在本站寻找。

本文标签: