简单的问题:我们有AES 128加密和一个密钥。如何计算密钥检查值(KCV)?
一个例子是48C3B4286FF421A4A328E68AD9E542A4和KCV应该是77DC84。
我正在C#上试用,但对于一个密码学新手来说,还有很多“未知数”。
编辑:有一个问题,为什么我需要它-假设我有一堆密钥-KCV组合,写下来的多个用户在我们的组织,但有些密钥是无效的(雇员写8,而不是B,1,而不是7,等等)。所以我需要一个程序,它会改变键中的一些字节,然后计算出KCV。如果键有一个错误的字节,那么它是以2ms计算的,对于两个错误的字节(5秒),对于三个错误的字节(每小时半),等等。
发布于 2013-11-22 14:32:17
实际上,您给出的情况正是这样的--在密钥48C3B4286FF421A4A328E68AD9E542A4
下加密的零向量是77dc841daeb43315fed9acdf2f965f45
,它限制在77dc84
上。
在你的问题中,你说你已经有了AES-128加密,在这一点上计算KCV不应该是一个问题。我不会问你为什么要计算一个KCV,但我要提醒你,也许有更好的方法来实现你的实际目标。带有此标记的其他条款提供了关于它们的好处的合理讨论。
发布于 2013-11-25 11:26:47
如果有人需要,可以使用C#代码来计算KCV (您只需要GetKcv返回值的前三个字节):
class Aes
{
private readonly byte[] _iv;
private readonly int _secretLength;
private readonly byte[] _secret;
private readonly RijndaelManaged _cryptoEngine;
public Aes()
{
_iv = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
_secretLength = 8;
_secret = new byte[_secretLength];
for (int i = 0; i < _secretLength; i++)
{
_secret[i] = 0;
}
_cryptoEngine = new RijndaelManaged
{
Padding = PaddingMode.Zeros,
Mode = CipherMode.ECB,
KeySize = 128,
BlockSize = 128
};
}
public byte[] GetKcv(byte[] key)
{
byte[] result;
using (var memoryStream = new MemoryStream())
{
using (var cryptoStream = new CryptoStream(memoryStream, _cryptoEngine.CreateEncryptor(key, _iv), CryptoStreamMode.Write))
{
cryptoStream.Write(_secret, 0, _secretLength);
cryptoStream.FlushFinalBlock();
result = memoryStream.ToArray();
}
}
return result;
}
}
https://crypto.stackexchange.com/questions/11872
复制相似问题