2012-10-28 14 views
9

Sto lottando con la migrazione del codice Java a Golang negli ultimi giorni e ora sono bloccato. Questo è il codice Java di lavoro:Migrazione del codice di decrittografia Java a Golang

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

mio implementazione in 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) 

quello che so finora:

  • tutti i valori di errore omessi da _ sono nil in questo pezzo di codice
  • l'intestazione bzip2 ("BZ") deve essere omessa per CBzip2InputStream, ma non per bzip2.NewReader
  • i primi 16 byte letti dal instream in Java e golang sono gli stessi, a partire dal 17 ° byte di tutti i byte differiscono per qualsiasi motivo
+2

Se i primi 16 byte sono uguali e il resto no, sospetto che le due implementazioni stiano utilizzando una modalità di concatenamento di blocchi diversa: http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation. Sembra che tu stia utilizzando CBC in Golang, non so quale sia il valore predefinito in Java. – Gijs

+0

Ho provato tutti i metodi disponibili in golang. CBC era l'unico in cui almeno i primi diversi byte sono stati decrittografati correttamente. Forse Java usa BCE per impostazione predefinita se non viene fornita alcuna IV, lo controllerò, grazie per il suggerimento. – fasmat

risposta

9

CBizp2InputStream utilizza infatti AES BCE. Questa è un'implementazione funzionante. Ho omesso movimentazione per rendere il codice breve di errore:

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) 

spiegazione supplementare:

  • src è un io.Reader e dst è un io.Writer, sia fornito alla funzione decifrare come argomenti
  • keystring contiene la chiave segreta
  • io uso i == 0 come la rottura condizione, perché err può o non può essere impostato per io.EOF in ultima lettura di successo (vedi golang io.Reader specification)
  • 012.

Funziona perfettamente. L'implementazione della crittografia ora dovrebbe essere facile.

Problemi correlati