首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将加密从AesCryptoServiceProvider转换为BouncyCastle

将加密从AesCryptoServiceProvider转换为BouncyCastle
EN

Stack Overflow用户
提问于 2015-10-30 16:11:59
回答 2查看 725关注 0票数 1

我在磁盘上有用AesCryptoServiceProvider加密的文件。我需要将代码转换为PCL (它没有类AesCryptoServiceProvider)。因此,我想使用https://www.nuget.org/packages/Portable.BouncyCastle/来读取和保存文件,而不更改加密。并防止需要转换所有文件..。

Key有32个字节长。IV有16个字节长。

这是原始代码:

代码语言:javascript
复制
private static byte[] Encrypt(string plainText, byte[] Key, byte[] IV)
{
    using (AesCryptoServiceProvider aesAlg = new AesCryptoServiceProvider())
    {
        aesAlg.Key = Key;
        aesAlg.IV = IV;

        ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
        using (MemoryStream outputStream = new MemoryStream())
        {
            using (CryptoStream csEncrypt = new CryptoStream(outputStream, encryptor, CryptoStreamMode.Write))
            {
                using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                {
                    swEncrypt.Write(plainText);
                }
            }

            return outputStream.ToArray();
        }
    }
}

AesCryptoServiceProvider的默认模式是带有PKCS7类型填充的CBC,然后我尝试使用类CbcBlockCipherPkcs7Padding。这是我最后一次尝试:

代码语言:javascript
复制
private static byte[] Encrypt(byte[] input, byte[] key, byte[] IV)
{
    var keyParameter = new KeyParameter(key);
    var parameters = new ParametersWithIV(keyParameter, IV);

    var cipher = new PaddedBufferedBlockCipher(new CbcBlockCipher(new AesEngine()), new Pkcs7Padding());

    cipher.Init(true, parameters);

    var rsl = new byte[cipher.GetOutputSize(input.Length)];
    var outOff = cipher.ProcessBytes(input, 0, input.Length, rsl, 0);

    cipher.DoFinal(rsl, outOff);
    return rsl;
}

文本“测试”的最初结果是8jykPv2OSILKjJwvgLRr1w==,但是使用新代码的结果是BaYeiuWSnRiHXBpwt19Dag==

那我错过了什么?

谢谢你的帮忙!

更新#1 :这里的是Key和IV的值:

代码语言:javascript
复制
private static byte[] KEY = {98, 193, 95, 78, 211, 151, 118, 57, 179, 5, 85, 181, 133, 20, 94, 101, 184, 175, 94, 164, 150, 119, 75, 207, 189, 178, 21, 213, 13, 217, 174, 44};
private static byte[] IV = {1, 199, 179, 189, 160, 220, 229, 238, 179, 14, 255, 147, 187, 49, 179, 134 };

更新2 :用于弹跳城堡,我使用以下行将plainText转换为input

代码语言:javascript
复制
var input = Encoding.Unicode.GetBytes(plainText);

区别就在那里..。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-02 15:57:16

在使用BouncyCastle调用Encrypt()方法之前,我用Encoding.Unicode.GetBytes(plainText);而不是Encoding.UTF8.GetBytes(plainText);转换了字符串

使用此修复,两种方法都会得到相同的结果!

票数 0
EN

Stack Overflow用户

发布于 2015-11-02 15:32:15

问题在于流器的编码。当写入加密流时,会产生相同的结果:

代码语言:javascript
复制
    [TestMethod]
    public void windows()
    {

        byte[] KEY = { 98, 193, 95, 78, 211, 151, 118, 57, 179, 5, 85, 181, 133, 20, 94, 101, 184, 175, 94, 164, 150, 119, 75, 207, 189, 178, 21, 213, 13, 217, 174, 44 };
        byte[] IV = { 1, 199, 179, 189, 160, 220, 229, 238, 179, 14, 255, 147, 187, 49, 179, 134 };

        byte[] input = System.Text.Encoding.UTF8.GetBytes("test");

        string win = Convert.ToBase64String(Encrypt_win(input, KEY, IV));

        string bc = Convert.ToBase64String(Encrypt_bc(input, KEY, IV));



        Assert.AreEqual(win, "8jykPv2OSILKjJwvgLRr1w==");
        Assert.AreEqual(bc, "8jykPv2OSILKjJwvgLRr1w==");

    }


    //private static byte[] Encrypt(string plainText, byte[] Key, byte[] IV)
    private static byte[] Encrypt_win(byte[] input, byte[] Key, byte[] IV)
    {
        using (AesCryptoServiceProvider aesAlg = new AesCryptoServiceProvider())
        {
            aesAlg.Key = Key;
            aesAlg.IV = IV;


            ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
            using (MemoryStream outputStream = new MemoryStream())
            {
                using (CryptoStream csEncrypt = new CryptoStream(outputStream, encryptor, CryptoStreamMode.Write))
                {
                    csEncrypt.Write(input, 0, input.Length);

                    /*
                    using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                    {
                        //swEncrypt.Write(plainText);
                        swEncrypt.Write(input);
                    }
                    */
                }

                return outputStream.ToArray();
            }
        }
    }



    private static byte[] Encrypt_bc(byte[] input, byte[] key, byte[] IV)
    {
        var keyParameter = new KeyParameter(key);
        var parameters = new ParametersWithIV(keyParameter, IV);

        var cipher = new PaddedBufferedBlockCipher(new CbcBlockCipher(new AesEngine()), new Pkcs7Padding());

        cipher.Init(true, parameters);

        var rsl = new byte[cipher.GetOutputSize(input.Length)];
        var outOff = cipher.ProcessBytes(input, 0, input.Length, rsl, 0);

        cipher.DoFinal(rsl, outOff);
        return rsl;
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33440377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档