如何在Rijndael加密中解密一个超过16个字母的单词

本文关键字:一个 16个 单词 Rijndael 加密 解密 | 更新日期: 2023-09-27 18:04:21

我在youtube上看了一段视频后,用C#中的Rijndael制作了一个加密程序。这很简单。

界面图片我可以输入64位和128位密钥。但是192位密钥是不允许的(为什么?(。

如果我使用64位密钥,当我加密一个单词并试图将其解密时,它只解密字符计数为<=的单词16.如果字符数超过16,则会抛出一条错误消息,说"填充无效,无法删除"。

128位密钥也是如此。只有字符数<32被解密回来。否则显示相同的错误消息。

以下是一个总结,以明确问题

问题汇总图片这是加密的代码

// need using System.Security.Cryptography;
// using System.IO;
public Form1()
{
    InitializeComponent();
    desObj = Rijndael.Create();
}
string cipherData;
byte[] chipherbytes;
byte[] plainbyte;
byte[] plainbyte2;
byte[] plainkey;                
SymmetricAlgorithm desObj;
private void button2_Click(object sender, EventArgs e)
{
    try
    {
        cipherData = textBox1.Text;
        plainbyte = Encoding.ASCII.GetBytes(cipherData);
        plainkey = Encoding.ASCII.GetBytes(textBox4.Text);
        desObj.Key = plainkey;
        //choose any method 
        desObj.Mode = CipherMode.CBC;
        desObj.Padding = PaddingMode.PKCS7;
        MemoryStream ms = new MemoryStream();
        CryptoStream cs = new CryptoStream(ms, desObj.CreateEncryptor(), CryptoStreamMode.Write);
        cs.Write(plainbyte, 0, plainbyte.Length);
        cs.Close();
        chipherbytes = ms.ToArray();
        ms.Close();
        textBox2.Text = Encoding.ASCII.GetString(chipherbytes);
    }
    catch(Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

解密码为

private void button3_Click(object sender, EventArgs e)
{
    try
    {
        MemoryStream ms1 = new MemoryStream(chipherbytes);
        CryptoStream cs1 = new CryptoStream(ms1, desObj.CreateDecryptor(), CryptoStreamMode.Read);
        cs1.Read(chipherbytes, 0, chipherbytes.Length);
        plainbyte2 = ms1.ToArray();
        cs1.Close();
        ms1.Close();
        textBox3.Text = Encoding.ASCII.GetString(plainbyte2);       
    }
    catch(Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

如何在Rijndael加密中解密一个超过16个字母的单词

密文由任意字节组成,这些字节不必构成有效的ASCII编码。如果有一些不可打印的ASCII字符,以这种方式使用时将不会打印:Encoding.ASCII.GetString(chipherbytes)

你需要用Base64或Hex之类的东西来编码密文,这会使编码的密文更大,但可以完美地表示为打印字符串。


其他注意事项:

  • CBC模式需要一个初始化向量(IV(,由于您没有设置任何IV,它将为您生成。问题是在解密过程中需要相同的IV。这个代码是有效的,因为您使用相同的desObj进行加密和解密,并且它包含相同的IV,但当您开始复制密文时,这是不起作用的
    静脉注射不应该是秘密。一种常见的方法是通过在密文前面写IV并在解密前将其切片,将其与密文一起传递。

  • 您没有进行任何完整性检查。最好验证您的密文,这样就不可能进行像填充预言机攻击这样的攻击,并且您可以检测密文是否被(恶意(篡改或密钥输入错误。这可以通过GCM或EAX等身份验证模式来实现,也可以通过先加密后MAC的方案来实现。

  • Rijndael通常支持128、192和256位的密钥大小。一个字节通常有8个比特,因此相当于16、24和32个字节的密钥。

  • 密钥不是由用户键入的,因为它们通常需要与随机噪声和特定长度无法区分。最好让用户输入密码,并使用PBKDF2、bcrypt、scrypt或Argon2等高迭代次数/成本因子从中导出密钥。