【问题标题】:Cryptographic Exception Unhandled (Cannot recognize byte key in encryption?)未处理的加密异常(无法识别加密中的字节密钥?)
【发布时间】:2018-07-02 08:28:00
【问题描述】:

我是 C# 新手,在尝试简单地加密和解密简单字符串时遇到了加密异常。对于密钥,我使用了短语“Pyber”的 SHA512 哈希。这似乎是一个问题,因为密钥(即 Pyber)的大小不合适。

在调试时,我得到这个:

在 mscorlib.dll 中发生了“System.Security.Cryptography.CryptographicException”类型的未处理异常

附加信息:指定的密钥不是该算法的有效大小。

感谢任何帮助。

编辑:现在尝试使用 MD5,加密效果很好,而解密仍然抛出相同的异常。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Security.Cryptography;

namespace ENC_1
 {
    public partial class main : Form
    {
        public main()
    {
        InitializeComponent();
    }

    string hash = "Pyber";

    private void button1_MouseHover(object sender, EventArgs e)
    {
        //Don't do anything
    }

    private void btn_encrypt_Click(object sender, EventArgs e)
    {
        byte[] data = UTF8Encoding.UTF8.GetBytes(txt_input.Text);
        using (SHA512CryptoServiceProvider SHA512 = new SHA512CryptoServiceProvider())
        {
            byte[] keys = SHA512.ComputeHash(UTF8Encoding.UTF8.GetBytes(hash));
            using (TripleDESCryptoServiceProvider tripDes = new TripleDESCryptoServiceProvider() { Key = keys, Mode = CipherMode.ECB, Padding = PaddingMode.PKCS7 })
            {
                ICryptoTransform transform = tripDes.CreateEncryptor();
                byte[] results = transform.TransformFinalBlock(data, 0, data.Length);
                txt_encrypt.Text = Convert.ToBase64String(results, 0, results.Length);
            }
        }

    }

    private void btn_decrypt_Click(object sender, EventArgs e)
    {
        byte[] data = Convert.FromBase64String(txt_encrypt.Text);
        using (SHA512CryptoServiceProvider SHA512 = new SHA512CryptoServiceProvider())
        {
            byte[] keys = SHA512.ComputeHash(UTF8Encoding.UTF8.GetBytes(hash));
            using (TripleDESCryptoServiceProvider tripDes = new TripleDESCryptoServiceProvider() { Key = keys, Mode = CipherMode.ECB, Padding = PaddingMode.PKCS7 })
            {
                ICryptoTransform transform = tripDes.CreateDecryptor();
                byte[] results = transform.TransformFinalBlock(data, 0, data.Length);
                txt_encrypt.Text = UTF8Encoding.UTF8.GetString(results);
            }
        }
    }
}
}

【问题讨论】:

    标签: c# encryption hash


    【解决方案1】:

    根据 .Net 支持文档,TripleDes 接受密钥 between 128 and 192 bits,即 16 和 24 个字符。

    SHA512 生成一个 64 个字符的密钥;我建议您尝试将密钥截断为 24 个字符,

    byte[] newKey= new byte[24];
    Array.Copy(keys, newKey, newKey.Length);
    

    【讨论】:

    • 不,将其更改为 24 个字符似乎不适用于 SHA512。但是,我确实尝试使用 MD5,它最终成功地加密了字符串,但解密不成功。出现了同样的异常 - 指定的密钥不是该算法的有效大小。
    • 感谢您的反馈,很高兴您达到了预期的结果
    【解决方案2】:

    问题已解决。将散列算法恢复为 MD5 是可行的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-26
      • 2021-12-17
      • 2013-03-20
      • 2012-05-08
      • 1970-01-01
      • 2017-04-26
      • 1970-01-01
      相关资源
      最近更新 更多