2009-08-25 90 views
2

我有一個用java編寫的新應用程序,需要從數據庫中讀取加密值。問題是數據庫中的所有值都使用ANSI x923填充方案的.NET代碼加密。我已經做了一些研究,看起來不像Java TripleDes庫有辦法指定這種填充方案。我想知道是否有人知道我是否正確,並且在java中不支持ANSI x923,或者有什麼方法可以使其工作。Java ANSI X923填充

回答

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); 
+0

很好的發現,第一種方法。我簡單地瀏覽了Bouncy Castle API,看看他們的JCE提供商是否支持這種方式,但我看起來不夠努力。 – laz 2009-08-25 20:26:07

0

Sun的文檔JCA Standard Algorithm Names中的「密碼算法填充」部分沒有提及該填充方案,因此它似乎不受支持。也就是說,Bouncy Castle提供了可以直接使用的X9.23填充的an implementation,如果您能夠使用外部庫並冒險脫離JCA的範圍。