我有一个用 java 编写的新应用程序,需要从数据库中读取加密值。问题是数据库中的所有值都由使用 ANSI x923 填充方案的 .NET 代码加密。我做了一些研究,看起来 Java TripleDes 库没有指定此填充方案的方法。我想知道是否有人知道我是否正确并且 ANSI x923 在 Java 中不受支持,或者是否有办法让它工作。
最佳答案
如果您使用 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);
关于Java ANSI X923 填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1329730/