Zeros_padding结果不同的输出



为什么会遇到错误的结果?它不是加密 支持的PKCS7吗?我想知道结果的价值是如何做。IV值等于所假定的良好交付。

// c# code
private byte[] _iv;
private readonly string key = "7794b12op901252bfcea66d6f0521212";
public string decrypt(string Input)
{
    string str = "";
    RijndaelManaged managed = new RijndaelManaged();
    managed.KeySize = 128;
    managed.BlockSize = 128;
    managed.Mode = CipherMode.CBC;
    managed.Padding = PaddingMode.Zeros;
    managed.Key = Encoding.UTF8.GetBytes(this.key);
    managed.IV = this._iv;
    try
    {
        ICryptoTransform transform = managed.CreateDecryptor();
        byte[] bytes = null;
        using (MemoryStream stream = new MemoryStream())
        {
            using (CryptoStream stream2 = new CryptoStream(stream, transform, CryptoStreamMode.Write))
            {
                byte[] buffer = Convert.FromBase64String(Input);
                stream2.Write(buffer, 0, buffer.Length);
            }
            bytes = stream.ToArray();
        }
        str = Encoding.ASCII.GetString(bytes);
    }
    catch (Exception)
    {
    }
    return str;
}
public string encrypt(string Input)
{
    RijndaelManaged managed = new RijndaelManaged();
    managed.KeySize = 128;
    managed.BlockSize = 128;
    managed.Mode = CipherMode.CBC;
    managed.Padding = PaddingMode.Zeros;
    managed.Key = Encoding.ASCII.GetBytes(this.key);
    managed.GenerateIV();
    this._iv = managed.IV;
    ICryptoTransform transform = managed.CreateEncryptor(managed.Key, managed.IV);
    byte[] inArray = null;
    using (MemoryStream stream = new MemoryStream())
    {
        using (CryptoStream stream2 = new CryptoStream(stream, transform, CryptoStreamMode.Write))
        {
            byte[] bytes = Encoding.UTF8.GetBytes(Input);
            stream2.Write(bytes, 0, bytes.Length);
        }
        inArray = stream.ToArray();
    }
    return Convert.ToBase64String(inArray);
}

以下是QT5代码。省略详细信息。

QT代码

    QString aeskey = "7794b12op901252bfcea66d6f0521212";
    QString _iv;
void Cipher::GenerateIV()
{
    AutoSeededRandomPool rnd;
    byte iv3[AES::BLOCKSIZE];
    rnd.GenerateBlock(iv3, AES::BLOCKSIZE);
    QByteArray out((char*)iv3, AES::BLOCKSIZE);
    _iv = out.toBase64();
}
QString Cipher::AESencrypt(QString Qstr_in)
{
    string str_in = Qstr_in.toStdString();
    string key = aeskey.toStdString();
    GenerateIV();
    string iv = _iv.toStdString();
    string str_out;
    CBC_Mode<AES>::Encryption encryption;
    encryption.SetKeyWithIV((byte*)key.c_str(), key.length(), (byte*)iv.c_str());
    StringSource encryptor(str_in, true,
                 new StreamTransformationFilter(encryption,
                 new Base64Encoder(
                 new StringSink(str_out)
//                ,StreamTransformationFilter::PKCS_PADDING
                ,StreamTransformationFilter::ZEROS_PADDING
           )
        )
    );
    return QString::fromStdString(str_out);
}
QString Cipher::AESdecrypt(QString Qstr_in)
{
    string str_in = Qstr_in.toStdString();
    string key = aeskey.toStdString();
    string iv = _iv.toStdString();
    string str_out;
    CBC_Mode<AES>::Decryption decryption;
    decryption.SetKeyWithIV((byte*)key.c_str(), key.length(), (byte*)iv.c_str());
    StringSource decryptor(str_in, true,
                 new Base64Decoder(
                 new StreamTransformationFilter(decryption,
                 new StringSink(str_out)
//                ,StreamTransformationFilter::PKCS_PADDING
                ,StreamTransformationFilter::DEFAULT_PADDING
            )
        )
    );
    return QString::fromStdString(str_out);
}

我真的不明白你的问题是什么,我无法真正评论,所以在这里我的想法:

ICryptoTransform transform = managed.CreateEncryptor(managed.Key, managed.IV);
ICryptoTransform transform = managed.CreateDecryptor();

既需要密钥和IV,或者至少需要相同。

然后您曾经使用过Rijndael然后AES。您也可以在您的C#中使用AE。

一对几件事跳出来...在C#代码中,您要这样做:

private readonly string key = "7794b12op901252bfcea66d6f0521212";
...
managed.Key = Encoding.UTF8.GetBytes(this.key);

在加密 代码中,您要这样做:

QString aeskey = "7794b12op901252bfcea66d6f0521212";
...
string key = aeskey.toStdString();

您需要在加密 中固定字符串。


另外, GenerateIV base64在事物的QT侧进行编码:

AutoSeededRandomPool rnd;
byte iv3[AES::BLOCKSIZE];
rnd.GenerateBlock(iv3, AES::BLOCKSIZE);
QByteArray out((char*)iv3, AES::BLOCKSIZE);
_iv = out.toBase64();

但是C#使用byte[](大概不是 base64编码):

private byte[] _iv;

相关内容

  • 没有找到相关文章

最新更新