2014-02-24 75 views
0

我在理解java和python的三重Des算法之間的概念時遇到了問題。在java中,加密的密鑰長度爲48個字符,而在python的情況下,不能應用相同的密鑰。我嘗試了兩種建議here,但它似乎無法用任何方式工作。我無法解密在python中由java加密的字符串。在Java代碼如下所示:Java中的DESede和python中的3des

import java.security.spec.KeySpec; 
    import javax.crypto.Cipher; 
    import javax.crypto.SecretKey; 
    import javax.crypto.SecretKeyFactory; 
    import javax.crypto.spec.DESedeKeySpec; 


    public class SecretKeyEncryptionExample 
    { 
     private static final String FORMAT = "ISO-8859-1"; 
     public static final String DESEDE_ENCRYPTION_SCHEME = "DESede"; 
     private KeySpec ks; 
     private SecretKeyFactory skf; 
     private Cipher cipher; 
     SecretKey key; 

     public SecretKeyEncryptionExample() 
     throws Exception 
     { 
     String myEncryptionKey = "<48 chars long string>"; 

     this.ks = new DESedeKeySpec(myEncryptionKey.getBytes("ISO-8859-1")); 
     this.skf = SecretKeyFactory.getInstance("DESede"); 
     this.cipher = Cipher.getInstance("DESede"); 
     this.key = this.skf.generateSecret(this.ks); 
     } 

而在蟒蛇,如果我使用:

from pyDes import * 
import hashlib 
import base64 
key1 = "<48 chars long key>".decode('hex') 
data = "<Some encrypted strings>" 
k = triple_des(key1, ECB, "\0\0\0\0\0\0\0\0", pad=None, padmode=PAD_PKCS5) 
e = k.decrypt(data) 
print e 

我根據給定here但不打印輸出的第一個建議做到了。我再次試圖在同一頁面第二個建議,其中要求使用前24個字符作爲重點,而忽略休息爲:

from pyDes import * 
import hashlib 
import base64 
key1 = "<taking only first 24 chars long key>" 
data = "<Some encrypted data>" 
k = triple_des(key1, ECB, "\0\0\0\0\0\0\0\0", pad=None, padmode=PAD_PKCS5) 
e = k.decrypt(data) 
print e 

但是,這也給了我沒有輸出。我很困惑與所有這些研究。請建議哪種方式是正確的,以及爲什麼我沒有從這兩種方法中獲得任何輸出。謝謝..

回答

1

在你的Python腳本中,你是十六進制解碼,據我所知。但是,在您的Java代碼中,您將字符串本身轉換爲字節。

試着這麼做:

String myEncryptionKey = "<48 chars long string>"; 
this.ks = new DESedeKeySpec(DatatypeConverter.parseHexBinary(myEncryptionKey)); 

另外,還要確保你完全指定您的密碼算法,以避免可移植性問題。所以更換:

Cipher.getInstance("DESede"); 

的東西,如:

Cipher.getInstance("DESede/ECB/PKCS5Padding"); 
+0

你的答案是非常helpful.It解決的問題。告訴我一件事,如果我使用getInstance(「DESede」)只有默認情況下java會採用哪種模式。 – Tirthajust4u

+0

@ Tirthajust4u Oracle提供程序傾向於默認使用ECB模式和PKCS#5填充。不確定其他提供者。因此爲什麼總是建議明確。 –