Java ANSI X923填充

时间:2009-08-25 17:30:18

标签: java .net interop cryptography

我有一个用java编写的新应用程序需要从db中读取加密值。问题是数据库中的所有值都是由使用ANSI x923填充方案的.NET代码加密的。我做了一些研究,看起来Java TripleDes库没有办法指定这个填充方案。我想知道是否有人知道我是否正确并且java中不支持ANSI x923,或者是否有办法使其正常工作。

2 个答案:

答案 0 :(得分:2)

如果您使用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);

答案 1 :(得分:0)

Sun JCA Standard Algorithm Names上的文档中的“密码算法填充”部分未提及该填充方案,因此它似乎不受支持。话虽这么说,Bouncy Castle提供了an implementation的X9.23填充,如果你能够使用外部库并冒险离开JCA的范围,可以直接使用。