2012-05-25 93 views
-1

我在加密C#中的东西时遇到了困难。C#DES ECB加密

我有3个变量。 第一个是16位十六进制,让我们把它叫做X值IE 0072701351979990 第二个也是16位十六进制值,让我们把它叫做ŸIE 3008168011FFFFFF

这两个值必须是异或“编辑拿到钥匙用于DES-ECB加密。

因此导致307a66934068666f。现在这是我加密的关键。 然后我有这个作为我的数据块,这是64位加密0E329232EA6D0D73

现在我有下面的代码加密这个。 加密结果应与数据块再次异或,并且结果为64位。不是这种情况。

这是我对加密

$ public static string DESEncrypt(string keyBlock,string dataBlock){ 
     DES desEncrypt = new DESCryptoServiceProvider(); 
     byte[] keyBlockBytes = BitConverter.GetBytes(Convert.ToInt64(keyBlock, 16)); 
     byte[] dataBlockBytes = BitConverter.GetBytes(Convert.ToInt64(dataBlock, 16)); 
     desEncrypt.Mode = CipherMode.ECB; 
     desEncrypt.Key = keyBlockBytes; 
     ICryptoTransform transForm = desEncrypt.CreateEncryptor(); 
     MemoryStream enecryptedStream = new MemoryStream(); 
     CryptoStream cryptoStream = new CryptoStream(enecryptedStream, transForm, CryptoStreamMode.Write); 
     cryptoStream.Write(dataBlockBytes, 0, dataBlockBytes.Length); 
     cryptoStream.FlushFinalBlock(); 
     byte[] encryptedData = new byte[enecryptedStream.Length]; 
     enecryptedStream.Position = 0; 
     enecryptedStream.Read(encryptedData, 0, encryptedData.Length); 
     string enCryptedHex = BitConverter.ToString(encryptedData); 

     return enCryptedHex.Replace("-",""); 
    } 

我在做什么错误的代码?

更新的问题 我已经从CodeInChaos测试了上述解决方案。 它确实给了我一个64位的结果。但仍然有错误。

这是我更新的代码。

关键块值是abababababababab ,数据块值是215135734068666F。

生成的64位结果应该与数据块再次异或。

最终答案是假设是414945DD33C97C47但我得到 288a08c01a57ed3d。

为什么它不出来?

以下是加密供应商文档中的规范。

加密是符合FIPS 46-3的DEA,即ECB模式下的单个DES,使用具有奇数奇偶校验的单个64- 位DES密钥。

$  public static string DESEncrypt(string keyBlock,string dataBlock){ 
     DES desEncrypt = new DESCryptoServiceProvider(); 
     byte[] keyBlockBytes = BitConverter.GetBytes(Convert.ToInt64(keyBlock, 16)); 
     byte[] dataBlockBytes = BitConverter.GetBytes(Convert.ToInt64(dataBlock, 16)); 
     desEncrypt.Mode = CipherMode.ECB; 
     desEncrypt.Key = keyBlockBytes; 
     desEncrypt.Padding = PaddingMode.None; 
     ICryptoTransform transForm = desEncrypt.CreateEncryptor(); 
     MemoryStream enecryptedStream = new MemoryStream(); 
     CryptoStream cryptoStream = new CryptoStream(enecryptedStream, transForm, CryptoStreamMode.Write); 
     cryptoStream.Write(dataBlockBytes, 0, dataBlockBytes.Length); 
     cryptoStream.FlushFinalBlock(); 
     byte[] encryptedData = enecryptedStream.ToArray(); 
     string enCryptedHex = BitConverter.ToString(encryptedData); 
     enCryptedHex = enCryptedHex.Replace("-", ""); 
     long iDeaEncrypt = Convert.ToInt64(enCryptedHex, 16); 
     long iDataBlock = Convert.ToInt64(dataBlock, 16); 
     long decoderKey = iDeaEncrypt^iDataBlock; 
     string decKeyHex = Convert.ToString(decoderKey, 16); 
     return decKeyHex; 
    } 
+0

”现在我有下面的代码加密这个,加密的结果应该再次与数据块XOR并导致64位结果,但情况并非如此。你是什​​么意思? – CodesInChaos

回答

0

我认为你需要填充设置为PaddingMode.None

desEncrypt.Padding = PaddingMode.None; 

但你确实应该认真思考,如果DES和欧洲央行真的是你想要的。


b.t.w.

byte[] encryptedData = new byte[enecryptedStream.Length]; 
encryptedStream.Position = 0; 
encryptedStream.Read(encryptedData, 0, encryptedData.Length); 

可以被代替:

encryptedData = encryptedStream.ToArray(); 
+0

嘿!非常感谢你。这工作100%。加密结果现在是一个64位的结果。它不是我决定使用DES和ECB。这是我生成使用这种加密的东西的硬件。但只限于一些旧的硬件。新的不使用这个。感谢您的BTW。 – MariusvStraaten

+0

当我测试了所有内容并与指南结果值进行比较后,它不匹配。 这些是他们给我的测试值。数据块是215135734068666F,密钥块是ababababababab。 然后生成的加密与原始数据块XOR。 我想要得到的最终结果是414945DD33C97C47。但我得到288a08c01a57ed3d – MariusvStraaten

0

也许是必要设置DES提供商使用FIPS 46-3标准使得DEA使用在FIPS指定的置换表等等46- 3。不幸的是,我也在为这个问题而努力。 “