mcrypt_decrypt():接收到的初始化向量,大小为

时间:2018-12-18 20:05:13

标签: c# php encryption mcrypt rijndael

面对与加密相关的问题。或更确切地说,解密。我的一些用户收到以下错误:

  

mod_fcgid:stderr:PHP警告:mcrypt_decrypt():接收到大小为10的初始化向量,但是在...下此加密模式需要大小为16。

  

mod_fcgid:stderr:PHP警告:mcrypt_decrypt():已收到   大小为30的初始化向量,但是为此需要大小为16   加密模式...

出现此错误的人-无法输入。

一百个人中有一个得到此错误。我只是不知道它与什么有关。我在Stackoverflow的开放空间中读到,这是由于 “ \ 0” 不够的事实。 不幸的是,所有技巧都对我没有帮助。怎样成为?我不想更改加密方法。完全适合我,不算这个错误。

解密代码:

function decrypt($text, $pkey)
{
    $key = $pkey;   
    $text = base64_decode($text); 
    $IV = substr($text, strrpos($text, "-[--IV-[-") + 9);
    $text = str_replace("-[--IV-[-".$IV, "", $text);

    return rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_CBC, $IV), "\0");
}

尝试一下(不幸的是没有帮助):

function pad_key($key){
    if(strlen($key) > 32) return false;
    $sizes = array(16,24,32);
    foreach($sizes as $s){
        while(strlen($key) < $s) $key = $key."\0";
        if(strlen($key) == $s) break; // finish if the key matches a size
    }
    return $key;
}

PHP版本:5.6

已添加(加密方法C#):

public static string EncryptMessage(byte[] text, string key)
{
    RijndaelManaged aes = new RijndaelManaged();
    aes.KeySize = 128;
    aes.BlockSize = 128;
    aes.Padding = PaddingMode.Zeros;
    aes.Mode = CipherMode.CBC;

    aes.Key = Encoding.Default.GetBytes(key);
    aes.GenerateIV();

    string IV = ("-[--IV-[-" + Encoding.Default.GetString(aes.IV));

    ICryptoTransform AESEncrypt = aes.CreateEncryptor(aes.Key, aes.IV);
    byte[] buffer = text;

    return Convert.ToBase64String(Encoding.Default.GetBytes(Encoding.Default.GetString(AESEncrypt.TransformFinalBlock(buffer, 0, buffer.Length)) + IV));
}

1 个答案:

答案 0 :(得分:-1)