2017-05-19 2 views
1

ich folgendem Code verwenden in Java zu verschlüsseln und entschlüsseln, und es scheint gut funktioniert:Encrypting in Java und Entschlüsseln in Postgres (mit pgcrypto Modul)

import javax.crypto.Cipher; 
import javax.crypto.SecretKey; 
import javax.crypto.spec.IvParameterSpec; 
import javax.crypto.spec.SecretKeySpec; 
import javax.xml.bind.DatatypeConverter; 
import java.security.SecureRandom; 

public class MainNew { 

    public static void main(String[] args) { 
     String iv = getEncryptionIV(); 
     System.out.println(" iv = "+iv); 

     String encryptedData= encryptWithIVandKey(iv,encryptionKey,"[email protected]"); 
     System.out.println(encryptedData); 
     String decryptedData = decrypt (iv,encryptionKey,encryptedData); 
     System.out.println(decryptedData); 
    } 


    static final String encryptionKey = "[email protected]"; 


    static byte[] doFinal(int encryptMode, SecretKey key, String iv, byte[] bytes) { 

     try { 
      Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
      cipher.init(encryptMode, key, new IvParameterSpec(DatatypeConverter.parseHexBinary(iv))); 
      byte[] data = cipher.doFinal(bytes); 

      return data; 

     } catch (Exception e) { 
      e.printStackTrace(); 
      System.out.println(e); 
     } 
     return null; 

    } 



    static SecretKey generateKey(String passphrase) { 

     SecretKey key = null; 

     try { 

      key = new SecretKeySpec(passphrase.getBytes("UTF-8"), "AES"); 


     } catch (Exception e) { 
      e.printStackTrace(); 
      System.out.println(e); 
     } 

     return key; 
    } 




    static String getEncryptionIV() { 
     SecureRandom random = new SecureRandom(); 
     byte[] ivBytes = new byte[16]; 
     random.nextBytes(ivBytes); 
     return DatatypeConverter.printHexBinary(ivBytes); 
    } 

    static String encryptWithIVandKey(String iv, String passphrase, final String strToEncrypt) { 
     String encryptedStr = ""; 

     try { 
      Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
      SecretKey key = generateKey(passphrase); 
      cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(DatatypeConverter.parseHexBinary(iv))); 

      encryptedStr = DatatypeConverter.printBase64Binary(cipher.doFinal(strToEncrypt.getBytes("UTF-8"))); 

     } catch (Exception e) { 
      e.printStackTrace(); 
      System.out.println(e); 
     } 


     return encryptedStr; 
    } 

    static String decrypt(String iv, String passphrase, String ciphertext) { 
     try { 
      SecretKey key = generateKey(passphrase); 
      byte[] decrypted = doFinal(Cipher.DECRYPT_MODE, key, iv, DatatypeConverter.parseBase64Binary(ciphertext)); 
      return new String(decrypted, "UTF-8"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      System.out.println(e); 
     } 
     return ""; 
    } 

} 

Aber wenn ich versuche, erzeugt verschlüsselte Daten zu entschlüsseln in postgres, immer Fehler:

select convert_from(decrypt_iv('IKMfAng499RNG9viRAreMM5Pmqooidkx76YUBflmzzs=', '[email protected]'::bytea, 'F700FE182F347120F1AE67F5B64E68C2'::bytea, 'aes-cbc/pad:pkcs'),'utf-8') res; 

ERROR: decrypt_iv error: Data not a multiple of block size

Antwort

0

natürlich, wenn Sie die Java-Klasse erneut ausführen, erhalten Sie eine frische IV-- und aus diesem Grund eine neue Verschlüsselungskette. Ich denke, dass die IV und verschlüsselte Zeichenfolge, die Sie in das PostgreSQL-Beispiel von oben injizieren, gebrochen sind. Wenn ich die Klasse laufen und frische Werte erhalten ...

Ausgabe von Java:

iv = CE63BC477D1096B6F38CA77964CBD2CB 
pl26CH0sNT8gycZe0FVSVUpwH/moMaFpa6zMtZHcBKQ= 
[email protected] 

Aber das ist nicht das eigentliche Problem ... Sie haben sich daran zu erinnern, Ihre verschlüsselten String wurde als base64-codierte Zeichenfolge ausgegeben. Benutze dazu Dekodieren (Text, Text). Dann kam die IV als hex-codierte Zeichenfolge heraus. Benutze auch dafür Dekodieren.

select convert_from(
    decrypt_iv(
    decode('pl26CH0sNT8gycZe0FVSVUpwH/moMaFpa6zMtZHcBKQ=','base64'), 
    '[email protected]'::bytea, 
    decode('CE63BC477D1096B6F38CA77964CBD2CB','hex'), 'aes-cbc/pad:pkcs'),'utf-8') res; 
Verwandte Themen