【发布时间】:2011-10-04 07:28:19
【问题描述】:
这在 C# 中可行吗?我将如何做到这一点?
双密钥三重 DES 是我们用 K1 加密,然后用 K2 解密,最后用 K1 再次加密的地方。因此,密钥空间为 2 x 56 = 112 位。
例如,对于K1=0x0123456789ABCDEF 和K2=0xFEDCBA9876543210,您可以将三重DES 密钥设置为0x0123456789ABCDEFFEDCBA98765432100123456789ABCDEF。
0123456789ABCDEF FEDCBA9876543210 0123456789ABCDEF
|<------K1------>|<------K2------>|<------K3------>|
它接受A9993E364706816A,它必须使用的两个键是K1 = 0123456789ABCDEF 和K2 = FEDCBA9876543210。最终结果必须是:6E5271A3F3F5C418 我没有得到。
更新:
我正在尝试创建我需要使用的连接密钥。上面使用的 2 个键被转换为一个字节数组,每个键的长度似乎都是 16。当 2 连接时,长度为 32。然后我的代码就爆炸了。密钥的长度必须为 16 或 24。在这种情况下我需要做什么?
UTF8Encoding characterEncoding = new UTF8Encoding();
byte[] accessKey1ByteArray = characterEncoding.GetBytes(accessKey1);
byte[] accessKey2ByteArray = characterEncoding.GetBytes(accessKey2);
byte[] accessKeysArray = accessKey1ByteArray.Concat(accessKey2ByteArray).ToArray();
这是我尝试设置值的地方:
public byte[] ComputeTripleDesEncryption(byte[] plainText, byte[] key)
{
TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
des.Key = key;
des.GenerateIV();
des.Mode = CipherMode.ECB;
des.Padding = PaddingMode.None;
ICryptoTransform ic = des.CreateEncryptor();
byte[] enc = ic.TransformFinalBlock(plainText, 0, plainText.Length);
return enc;
}
更新 2
我需要设置尺寸吗?我发送的字节数组键是 K1 + K2 + K1。
我发送的文本,是否需要将其转换为您推荐的字节,或者以下内容也可以解决问题?
UTF8Encoding characterEncoding = new UTF8Encoding();
byte[] block1ByteArray = characterEncoding.GetBytes(block1);
block1的值为:A9993E364706816A。
我如何获得 A9993E364706816A 来自我的 SHA-1 哈希结果。我要编码的字符串的散列结果的前 16 个字符。
【问题讨论】:
-
这个算法是由某个标准指定的还是自制的?
-
我不知道,因为我不太了解加密。请参阅更新后的程序流程。
-
您可能只关心完成任务,但安全问题确实很难做好。所以我建议调查是否有一个描述算法的标准,并在此基础上编写你的实现。标准的措辞非常谨慎,通常还附带测试数据,因此您可以检查您的实施是否符合规范。如果该算法是自制的,它可能会损坏。除非需要与现有软件组件交互,否则请坚持切换到标准化算法。如果是:祝你好运! :-)
-
谢谢。让我看看我能做什么。
-
@dtb:这就是我真正想要的,这可能吗? .NET 真的能满足这个需求吗?
标签: c# .net encryption