2012-10-28 29 views
9

पर जावा डिक्रिप्शन कोड माइग्रेट करें मैं पिछले कुछ दिनों से जावा कोड के गोलांग के माइग्रेशन के साथ संघर्ष कर रहा हूं और अब मैं अटक गया हूं।गोलांग

final Key k = new SecretKeySpec(keyString.getBytes(), "AES"); 
Cipher c = Cipher.getInstance("AES"); 
c.init(Cipher.DECRYPT_MODE, k); 

final InputStream in = new BufferedInputStream(new FileInputStream(fileNameToDecrypt)); 
final CipherInputStream instream = new CipherInputStream(in, c); 

if (instream.read() != 'B') { 
    System.out.println("Error"); 
} 

if (instream.read() != 'Z') { 
    System.out.println("Error"); 
} 

final CBZip2InputStream zip = new CBZip2InputStream(instream); 

Golang में मेरे कार्यान्वयन:

c, _ := aes.NewCipher([]byte(keyString)) 
// IV must be defined in golang 
iv := []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} 
d := cipher.NewCBCDecrypter(c, iv) 

fi, _ := os.Open(fileNameToDecrypt) 
stat, _ := fi.Stat() 
enc := make([]byte, stat.Size()) 
dec := make([]byte, stat.Size()) 
fi.Read(enc) 
d.CryptBlocks(dec, enc) 
instream := bytes.NewBuffer(dec) 
zip := bzip2.NewReader(instream) 

क्या मैं अब तक पता:

  • सभी त्रुटि _ द्वारा छोड़े गए मूल्यों के इस टुकड़े में nil हैं, तो यह काम कर जावा कोड है कोड
  • bzip2 शीर्षलेख ("BZ") CBzip2InputStream के लिए छोड़ा जाना चाहिए, लेकिनके लिए नहीं
  • पहले 16 बाइट्स जावा और golang में instream से पढ़ा है, एक ही हैं 17 बाइट सभी बाइट्स जो भी कारण
+2

यदि पहले 16 बाइट समान हैं और बाकी नहीं हैं, तो मुझे संदेह है कि दो कार्यान्वयन एक अलग ब्लॉक चेनिंग मोड का उपयोग कर रहे हैं: http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation। ऐसा लगता है कि आप गोलांग में सीबीसी का उपयोग कर रहे हैं, यह सुनिश्चित नहीं है कि जावा ऑफ-डिफॉल्ट में डिफ़ॉल्ट क्या है। – Gijs

+0

मैंने गोलांग में उपलब्ध सभी विधियों का प्रयास किया। सीबीसी केवल कम से कम पहले बाइट्स सही ढंग से डिक्रिप्ट किए गए थे। हो सकता है कि यदि कोई चौथाई आपूर्ति नहीं की जाती है तो जावा डिफ़ॉल्ट रूप से ईसीबी का उपयोग करता है, मैं उस पर जांच करूंगा, संकेत के लिए धन्यवाद। – fasmat

उत्तर

9

CBizp2InputStream वास्तव में एईएस ईसीबी का उपयोग करता है के लिए अलग के साथ शुरू। यह एक कामकाजी कार्यान्वयन है। मैं कोड कम करने के लिए से निपटने त्रुटि छोड़े गए:

c, _ := aes.NewCipher([]byte(keyString)) 
bufIn := make([]byte, 16) 
bufOut := make([]byte, 16) 
dec := bytes.NewBuffer(make([]byte, 0)) 
var i int 

for { 
    i, _ = src.Read(bufIn) 
    if i == 0 { 
     break 
    } 

    c.Decrypt(bufOut, bufIn) 
    dec.Write(bufOut) 
} 

zip := bzip2.NewReader(dec) 
io.Copy(dst, zip) 

अतिरिक्त व्याख्या:

  • src एक io.Reader है और डीएसटी, दोनों बहस
  • के रूप में डिक्रिप्ट समारोह को आपूर्ति की एक io.Writer है
  • keyString गुप्त कुंजी
  • मैं शर्त तोड़ने क्योंकि err या पिछले सफल पठन में io.EOF करने के लिए सेट नहीं किया जा सकता कर सकते हैं के रूप में i == 0 का उपयोग करें (golang io.Reader specification देखें) शामिल
  • 012,

पूरी तरह से काम करता है। कार्यान्वयन एन्क्रिप्शन अब आसान होना चाहिए।

संबंधित मुद्दे