【问题标题】:How to do encryption with any key如何使用任何密钥进行加密
【发布时间】:2015-03-25 16:03:24
【问题描述】:

我正在使用 Rijndael 对称算法实现加密。这是有效的,但我想改变它以使用任何键。我不想生成密钥,我想让用户选择他自己的密钥,比如他的加密密码。

RijndaelManaged myRijndael = new RijndaelManaged();
myRijndael.GenerateKey();
myRijndael.GenerateIV();

var encryptor = new RijndaelManagedEncryption();

var encrypted = encryptor.EncryptSettingValue(myRijndael.Key, "Encrypt this", myRijndael.IV);

比如这样

RijndaelManaged myRijndael = new RijndaelManaged();
myRijndael.GenerateIV();
var key = Convert.FromBase64String("pasword")
var encryptor = new RijndaelManagedEncryption();

var encrypted = encryptor.EncryptSettingValue(key , "Encrypt this", myRijndael.IV);

但如果我这样做,我会得到异常:

在 mscorlib.dll 中出现“System.FormatException”类型的未处理异常 附加信息:Base-64 字符数组或字符串的长度无效。

如果您想查看算法,请点击以下链接:https://msdn.microsoft.com/en-us/library/system.security.cryptography.rijndaelmanaged(v=vs.110).aspx

【问题讨论】:

    标签: c# encryption


    【解决方案1】:

    首先,字符串“password”不是一个有效的Base64字符串,所以你不能随意转换。

    此外,您不应该仅仅因为它不会生成随机化的密钥,就从某个字符串“直接”获取加密密钥。

    使用Rfc2898DeriveBytes 代替:

    var password = "pasword";
    var salt = new byte[] { 0xe3, 0x5c, 0x51, 0x6a, 0x13, 0x55, 0x46, 0xf8, 0x75, 0xba, 0x54, 0xc3, 0x42, 0x5b, 0x70, 0xac };
    var key = new Rfc2898DeriveBytes(password, salt).GetBytes(32);
    

    这里的salt 是一些随机的字节数组,不管它实际上是什么。它只需要为密钥生成带来更多随机性,并且可以是任意的(但始终相同,以确保您从相同的密码生成相同的密钥)。

    【讨论】:

    • 谢谢。以及如何回去?如何从密钥中获取密码?
    • 为什么需要从密钥中获取密码?典型用例:用户提供密码,您正在生成密钥并使用该密钥进行加密/解密。完全不需要反向密钥->密码,而且据我所知是不可能的。
    • @merso0027 如果您有任意长度的密码,您希望如何从固定长度的密钥中获取密码?这对于任意密码短语根本不可行。
    • 这个问题是每次我调用 Rfc2898DeriveBytes 我都会得到相同密码的不同值。我希望允许用户获取加密数据,并且每次他输入密码数据都会被加密。 VI 是硬编码的(例如)。如果用户输入密码,密码会通过 Rfc2898DeriveBytes 转换为密钥,下次输入相同密码时如何获取相同的密钥。
    • 您确定每次从密码生成密钥时都使用相同的salt 吗?如果不是 - 您应该每次都使用相同的盐,只需对其进行硬编码,然后您将从相同的密码中获得相同的密钥。运行我提供的代码 sn -p 几次,你会看到 - 每次你得到相同的密钥,因为密码和盐是相同的。
    猜你喜欢
    • 2013-04-08
    • 2010-10-10
    • 2016-05-19
    • 2022-01-13
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    相关资源
    最近更新 更多