2013-03-11 41 views
5

Tôi có phương pháp ColdFusion để giải mã chuỗi: PFN123. Nó sử dụng thuật toán AES, mã hóa HEX và có độ dài 128 bit. Đầu ra là:ColdFusion Java Đầu ra mã hóa khác nhau cho cùng một chuỗi với thuật toán AES

32952063062A232355AABB63E129EA9F 

Tôi đã viết mã java tương đương để mã hóa và giải mã AES. Tuy nhiên, nó tạo ra một kết quả khác:

07e342ad4b59b276cbb6418248aaf886. 

Tôi không hiểu tại sao kết quả lại khác nhau cho cùng một thuật toán và lược đồ mã hóa. Có ai giải thích tại sao không? Cảm ơn trước.

Mã Java:

import java.security.Key; 

import javax.crypto.Cipher; 
import javax.crypto.spec.SecretKeySpec; 

import org.apache.commons.codec.binary.Hex; 

public class AESEncryptionDecryptionTest { 

    private static final String ALGORITHM  = "AES"; 
    private static final String myEncryptionKey = "OIXQUULC7khaJzzOOHRqgw=="; 
    private static final String UNICODE_FORMAT = "UTF8"; 

    public static String encrypt(String valueToEnc) throws Exception { 
     Key key = generateKey(); 
     Cipher c = Cipher.getInstance(ALGORITHM); 
     c.init(Cipher.ENCRYPT_MODE, key); 
     byte[] encValue = c.doFinal(valueToEnc.getBytes(UNICODE_FORMAT)); 
     String encryptedValue = new Hex().encodeHexString(encValue); 
     return encryptedValue; 
    } 

    public static String decrypt(String encryptedValue) throws Exception { 
     Key key = generateKey(); 
     Cipher c = Cipher.getInstance(ALGORITHM); 
     c.init(Cipher.DECRYPT_MODE, key); 
     byte[] decordedValue = new Hex().decode(encryptedValue.getBytes()); 
     byte[] decValue = c.doFinal(decordedValue);//////////LINE 50 
     String decryptedValue = new String(decValue); 
     return decryptedValue; 
    } 

    private static Key generateKey() throws Exception { 
     byte[] keyAsBytes; 
     keyAsBytes = myEncryptionKey.getBytes(); 
     Key key = new SecretKeySpec(keyAsBytes, ALGORITHM); 
     return key; 
    } 

    public static void main(String[] args) throws Exception { 

     String value = "PFN123"; 
     String valueEnc = AESEncryptionDecryptionTest.encrypt(value); 
     String valueDec = AESEncryptionDecryptionTest.decrypt(valueEnc); 

     System.out.println("Plain Text : " + value); 
     System.out.println("Encrypted : " + valueEnc); 
     System.out.println("Decrypted : " + valueDec); 
    } 

} 
+0

ColdFusion bổ sung đang làm gì trong phương thức ẩn giải mã mà tôi đang thiếu trong Java ?? –

+0

Nó có thể sử dụng mã hóa khác với UTF8, sử dụng một chế độ chuỗi khối khác, sử dụng một phần đệm khác (và dĩ nhiên là một khóa đầu vào khác, nhưng tôi đoán bạn đã kiểm tra). –

+0

Có thử tất cả ba lựa chọn của tất cả các kết hợp .... Vấn đề của tôi là tôi phải mã hóa một chuỗi trong coldFusion và sau đó giải mã nó trong Java. –

Trả lời

2

Cảm ơn sự ủng hộ. Tôi đã tìm thấy câu trả lời của mình. ColdFusion lưu trữ khóa trong các byte được giải mã Base64 của nó. Vì vậy, trong java, chúng ta phải tạo khóa bằng cách giải mã thông qua BASE64Decoder:

private static Key generateKey() throws Exception 
{ 
    byte[] keyValue; 
    keyValue = new BASE64Decoder().decodeBuffer(passKey); 
    Key key = new SecretKeySpec(keyValue, ALGORITHM); 

    return key; 
} 
Các vấn đề liên quan