c# - C# 和 Java 中 Triple DES 的实现有什么区别吗? Java 给出错误 IV 大小错误

标签 c# java encryption encryption-symmetric tripledes

在我们的应用程序中,我们使用 Triple DES 来加密和解密数据。我们有 C# 中的 enc/dec 代码,它使用 24 字节 key 和 12 字节 IV,工作正常。现在我们想在 java 中实现相同的代码,但是当我使用 12 字节 IV 时,我在 java 中收到错误,指出 IV 大小错误。当我用谷歌搜索时,我了解到java使用8字节IV。现在我很困惑为什么 C# 和 JAVA 对于三重 DES 的实现存在差异。或者我错过了什么?

这与我们的加密代码类似

<pre><code>class cTripleDES { // define the triple des provider private TripleDESCryptoServiceProvider m_des = new TripleDESCryptoServiceProvider(); // define the string handler private UTF8Encoding m_utf8 = new UTF8Encoding(); // define the local property arrays private byte[] m_key; private byte[] m_iv; public cTripleDES(byte[] key, byte[] iv) { this.m_key = key; this.m_iv = iv; } public byte[] Encrypt(byte[] input) { return Transform(input, m_des.CreateEncryptor(m_key, m_iv)); } public byte[] Decrypt(byte[] input) { return Transform(input, m_des.CreateDecryptor(m_key, m_iv)); } public string Encrypt(string text) { byte[] input = m_utf8.GetBytes(text); byte[] output = Transform(input, m_des.CreateEncryptor(m_key, m_iv)); return Convert.ToBase64String(output); } public string Decrypt(string text) { byte[] input = Convert.FromBase64String(text); byte[] output = Transform(input, m_des.CreateDecryptor(m_key, m_iv)); return m_utf8.GetString(output); } private byte[] Transform(byte[] input, ICryptoTransform CryptoTransform) { // create the necessary streams MemoryStream memStream = new MemoryStream(); CryptoStream cryptStream = new CryptoStream(memStream, CryptoTransform, CryptoStreamMode.Write); // transform the bytes as requested cryptStream.Write(input, 0, input.Length); cryptStream.FlushFinalBlock(); // Read the memory stream and // convert it back into byte array memStream.Position = 0; byte[] result = memStream.ToArray(); // close and release the streams memStream.Close(); cryptStream.Close(); // hand back the encrypted buffer return result; } </code></pre> <p>}</p>

这就是我们利用它的方式:

<pre><code>string IVasAString = "AkdrIFjaQrRQ"; byte[] iv = Convert.FromBase64String(IVasAString); byte[] key = ASCIIEncoding.UTF8.GetBytes(KEY); // instantiate the class with the arrays cTripleDES des = new cTripleDES(key, iv); string output = des.Encrypt("DATA TO BE ENCRYPTED"); </code></pre>

最佳答案

TripleDES 有 64-bit block size 。您需要使用8 byte IV在 C# 中。

关于c# - C# 和 Java 中 Triple DES 的实现有什么区别吗? Java 给出错误 IV 大小错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14352447/

相关文章:

flash - 将未经篡改的数据从 Flash 应用程序传递到服务器?

java - 如何在 Java 中加密/解密文件?

c# - 如何测试使用 DbEntityValidationException 的异常扩展方法?

c# - 为每个构建配置设置不同的 ApplicationIcon

java - 避免在Eclipse中下载Gradle依赖项

java - 如何在 Java 中检索/计算 X509 证书的指纹?

c# - 如何使正则表达式只匹配完全匹配项?

c# - 在一个页面上使用 GridView Linkbutton 获取记录 ID,并使用 C# 在 ASP.NET 中获取另一个页面

java - 如何在 XPages 中控制绑定(bind)到作用域变量的数值类型

java - 在 Java 和 PHP 中使用 PBKDF2