【问题标题】:Decrypting using rijndael and C# issue使用 rijndael 和 C# 问题解密
【发布时间】:2014-01-21 09:55:13
【问题描述】:

我正在加密一些文本并将其转换为 base64,解密后我似乎有一些奇怪的字符,因为它会阻止其余的输出......

例如,我想加密 10,2013-12-16 10:22:24,1387189344 转换为 MaEA8gd7Xyg8tNBrtVBlb75U/a0J9x5x7UryI81gy3R+ZvL01p05uzDtzdBWL5Pg (base64) 然后当我解密时我尝试将输出打印为“[” + 解密 + "]" 但第二个括号没有出来.....

这是我的代码。提前致谢。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DataSync;
using System.IO;
using System.Security.Cryptography;

namespace EncryptionTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        // encrypt
        private void button1_Click(object sender, EventArgs e)
        {
            txtOutput.Text = Encrypt(txtData.Text, txtCIV.Text, txtSecret.Text);

        }

        // decrypt
        private void button2_Click(object sender, EventArgs e)
        {
            txtOutput.Text = "[" + Decrypt(txtData.Text, txtCIV.Text, txtSecret.Text) + "\r\n" + "]";
        }



        public string GenerateIV()
        {
            RijndaelManaged RM = new RijndaelManaged();
            RM.KeySize = 128;
            RM.BlockSize = 128;
            RM.Mode = CipherMode.CBC;
            RM.Padding = PaddingMode.Zeros;

            RM.GenerateIV();

            return Convert.ToBase64String(RM.IV);
        }

        public string Decrypt(string Encrypted, string IV, string SecretKey)
        {
            byte[] DecryptThis = Convert.FromBase64String(Encrypted);
            byte[] DecryptIV = Convert.FromBase64String(IV);
            byte[] Key = Encoding.UTF8.GetBytes(SecretKey);

            SHA256 SHA256Obj = SHA256.Create();
            byte[] PrivateKeyHash = SHA256Obj.ComputeHash(Key, 0, Key.Length);

            RijndaelManaged RM = new RijndaelManaged();
            RM.Mode = CipherMode.CBC;
            RM.Padding = PaddingMode.Zeros;

            MemoryStream ms = new MemoryStream();
            CryptoStream cs = new CryptoStream(ms, RM.CreateDecryptor(PrivateKeyHash, DecryptIV), CryptoStreamMode.Write);

            cs.Write(DecryptThis, 0, DecryptThis.Length);
            cs.FlushFinalBlock();
            cs.Close();          

            // Strip null (padding) characters
            int Position = -1;
            foreach (byte Char in ms.ToArray())
            {
                ++Position;
                if (Char == 0)
                {
                break;
                }
            }

            string Temp = Encoding.UTF8.GetString(ms.ToArray());

            return Temp.Substring(0, Position+1).Trim();              
        }

        public string Encrypt(string ToBeEncrypted, string IV, string SecretKey)
        {
            byte[] EncryptThis = Encoding.UTF8.GetBytes(ToBeEncrypted);
            byte[] EncryptIV = Convert.FromBase64String(IV);
            byte[] Key = Encoding.UTF8.GetBytes(SecretKey);

            SHA256 SHA256Obj = SHA256.Create();
            byte[] PrivateKeyHash = SHA256Obj.ComputeHash(Key, 0, Key.Length);

            RijndaelManaged RM = new RijndaelManaged();
            RM.Mode = CipherMode.CBC;
            RM.Padding = PaddingMode.Zeros;

            MemoryStream ms = new MemoryStream();
            CryptoStream cs = new CryptoStream(ms, RM.CreateEncryptor(PrivateKeyHash, EncryptIV), CryptoStreamMode.Write);

            cs.Write(EncryptThis, 0, EncryptThis.Length);
            cs.FlushFinalBlock();
            cs.Close();

            return Convert.ToBase64String(ms.ToArray());
        }
    }
}

【问题讨论】:

  • 看起来您在右括号前插入换行符? txtOutput.Text = "[" + Decrypt(txtData.Text, txtCIV.Text, txtSecret.Text) + "\r\n" + "]";
  • 将代码放在问题本身中,并尽可能减少它。然后阅读msmvps.com/blogs/jon_skeet/archive/2014/01/20/…
  • FYI 对于那些发现这个问题的人,参考上面的代码,sha256 不应该用作 KDF,并且用零填充是有问题的。如果你不知道这一点,你应该使用一个为你处理加密细节的库。

标签: c# encryption rijndael


【解决方案1】:

您的代码中有一个换行符:

txtOutput.Text = "[" + Decrypt(txtData.Text, txtCIV.Text, txtSecret.Text) + "\r\n" + "]";
                                                                              ^^^

您必须在括号之后放置换行符:

txtOutput.Text = "[" + Decrypt(txtData.Text, txtCIV.Text, txtSecret.Text) + "]" + "\r\n";

我也不确定你是否需要换行符。您使用的是多行文本框吗?

【讨论】:

  • @Anonymous 您能否通过此处提供的答案解决您的问题?如果是,请接受最佳答案并关闭问题
【解决方案2】:

您没有删除 Decrypt() 方法中的所有“\0”。 在第 82 行,替换

return Temp.Substring(0, Position + 1).Trim();

通过

return Temp.Substring(0, Position).Trim();

【讨论】:

    猜你喜欢
    • 2021-06-06
    • 1970-01-01
    • 1970-01-01
    • 2012-07-20
    • 1970-01-01
    • 2023-03-23
    • 2012-11-18
    • 2010-11-03
    • 1970-01-01
    相关资源
    最近更新 更多