Java ANSI X923 Padding - PullRequest
       18

Java ANSI X923 Padding

2 голосов
/ 25 августа 2009

У меня есть новое приложение, написанное на Java, которое должно считывать зашифрованные значения из БД. Проблема в том, что все значения в БД были зашифрованы кодом .NET, который использует схему заполнения ANSI x923. Я провел некоторое исследование, и не похоже, что в библиотеках Java TripleDes есть способ указать эту схему заполнения. Мне было интересно, если кто-нибудь знает, правильно ли я и ANSI x923 не поддерживается в Java, или есть ли способ заставить это работать.

Ответы [ 2 ]

2 голосов
/ 25 августа 2009

Если вы используете Bouncy Castle JCE, он поддерживает заполнение X923. Вы можете получить такой шифр (при условии, что вы используете режим CBC),

cipher = Cipher.getInstance("DESede/CBC/X9.23PADDING");

Я не думаю, что JCE Sun поддерживает это. Но вы можете просто расшифровать его без отступов и удалить его самостоятельно. В 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);
0 голосов
/ 25 августа 2009

Раздел «Заполнение алгоритма шифрования» в документе Sun по Имена стандартных алгоритмов JCA не содержит упоминания об этой схеме дополнения, поэтому кажется, что она не поддерживается. При этом Bouncy Castle обеспечивает реализацию заполнения X9.23, которое можно использовать напрямую, если вы можете использовать внешнюю библиотеку и выходить за пределы JCA.

...