【发布时间】:2009-08-25 17:30:17
【问题描述】:
我有一个用 java 编写的新应用程序,需要从数据库中读取加密值。问题是 db 中的所有值都由使用 ANSI x923 填充方案的 .NET 代码加密。我做了一些研究,看起来 Java TripleDes 库没有办法指定这种填充方案。我想知道是否有人知道我是否正确并且 java 不支持 ANSI x923,或者是否有办法让它工作。
【问题讨论】:
标签: java .net interop cryptography
我有一个用 java 编写的新应用程序,需要从数据库中读取加密值。问题是 db 中的所有值都由使用 ANSI x923 填充方案的 .NET 代码加密。我做了一些研究,看起来 Java TripleDes 库没有办法指定这种填充方案。我想知道是否有人知道我是否正确并且 java 不支持 ANSI x923,或者是否有办法让它工作。
【问题讨论】:
标签: java .net interop cryptography
如果您使用 Bouncy Castle JCE,它支持 X923 填充。您可以获得这样的密码(假设您使用 CBC 模式),
cipher = Cipher.getInstance("DESede/CBC/X9.23PADDING");
我认为 Sun 的 JCE 不支持它。但是您可以简单地解密它而不使用填充并自己删除填充。对于 X9.23,最后一个字节是添加的填充数。所以你可以做这样的事情,
cipher = Cipher.getInstance("DESede/CBC/NOPADDING");
cipher.init(Cipher.DECRYPT_MODE, key, ivSpec);
int outSize = cipher.getOutputSize(cipherText.length);
plainText = new byte[outSize];
length = cipher.update(cipherText, plainText, 0);
cipher.doFinal(plainText, length);
//Remove padding
int newLen = plainText.length - (plainText[plainText.length-1] & 0xFF);
byte[] data = new byte[newLen];
System.arraycopy(plainText, 0, data, 0, newLen);
【讨论】:
Sun 在JCA Standard Algorithm Names 上的文档中的“密码算法填充”部分没有提及该填充方案,因此它似乎不受支持。话虽如此,Bouncy Castle 提供了 an implementation 的 X9.23 填充,如果您能够使用外部库并冒险摆脱 JCA 的限制,则可以直接使用它。
【讨论】: