【问题标题】:Java ANSI X923 PaddingJava ANSI X923 填充
【发布时间】:2009-08-25 17:30:17
【问题描述】:

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

【问题讨论】:

    标签: java .net interop cryptography


    【解决方案1】:

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

    【讨论】:

    • 第一种方法很好找。我简要地浏览了 Bouncy Castle API,看看他们的 JCE 提供者是否支持这种方式,但我没有仔细研究。
    【解决方案2】:

    Sun 在JCA Standard Algorithm Names 上的文档中的“密码算法填充”部分没有提及该填充方案,因此它似乎不受支持。话虽如此,Bouncy Castle 提供了 an implementation 的 X9.23 填充,如果您能够使用外部库并冒险摆脱 JCA 的限制,则可以直接使用它。

    【讨论】:

      猜你喜欢
      • 2014-02-03
      • 2012-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-15
      • 2015-08-14
      相关资源
      最近更新 更多