2017-05-19 1 views
1

(pgcrypto 모듈을 사용하여) 포스트 그레스에서의 암호를 해독하고 그것을 잘 작동하는 것 같다 :자바 암호화 내가 암호화 및 Java에서 해독하는 다음 코드를 사용하고

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 ""; 
    } 

} 

을하지만 난에서 생성 된 암호화 된 데이터를 해독 할 때 포스트 그레스, 점점 오류 : 물론

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

답변

0

, 당신은 자바 클래스를 다시 실행, 당신은 신선한 IV--을 얻고 그 때문에, 새로운 암호화 문자열입니다. 위에서 설명한 PostgreSQL 예제에 삽입 된 IV 및 암호화 된 문자열이 손상되었다고 생각합니다. 내가 클래스를 실행하고 신선한 값을 가져 ...

출력 자바에서 때 :

iv = CE63BC477D1096B6F38CA77964CBD2CB 
pl26CH0sNT8gycZe0FVSVUpwH/moMaFpa6zMtZHcBKQ= 
[email protected] 

하지만 그건 진짜 문제가 아니에요 ... 당신은 당신의 암호화 기억해야 문자열이 base64로 인코딩 된 문자열로 나옵니다. 이를 위해 디코드 (텍스트, 텍스트)를 사용하십시오. 그런 다음 IV가 16 진수 문자열로 나옵니다. 디코드도 사용하십시오.

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