2012-03-12 13 views
5

अपने Android एप्लिकेशन में मैं भेजा है और जवाब दिया एईएस एन्क्रिप्शन द्वारा एन्क्रिप्ट किया जाता है डेटा एक वेब सेवा से संचार कर रहा हूँ।एईएस एन्क्रिप्शन जावा -> पीएचपी -> जावा

तो मैं निम्नलिखित क्या करता हूं। मैं एक बेस 64 इनकोडिंग एईएस एन्क्रिप्टेड JSON स्ट्रिंग share.php को

Share.php तो यह स्ट्रिंग डिक्रिप्ट और डेटाबेस में डालने जाएगा भेज रहा। इसके बाद PHP प्रतिक्रिया को एनकोड एनक्रिप्ट करेगा।

मेरे एंड्रॉइड एप्लिकेशन को इस संदेश को डीक्रिप्ट करने की आवश्यकता है।

लेकिन PHP प्रतिक्रिया का डिक्रिप्शन बहुत अच्छा नहीं चल रहा है।

यह मेरा AES.java है:

public class AES { 
private final String characterEncoding = "UTF-8"; 
private final String cipherTransformation = "AES/ECB/PKCS5Padding"; 
private final String aesEncryptionAlgorithm = "AES"; 

public byte[] decrypt(byte[] cipherText, byte[] key, byte [] initialVector) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException 
{ 
    Cipher cipher = Cipher.getInstance(cipherTransformation); 
    SecretKeySpec secretKeySpecy = new SecretKeySpec(key, aesEncryptionAlgorithm); 
    //IvParameterSpec ivParameterSpec = new IvParameterSpec(initialVector); 
    //cipher.init(Cipher.DECRYPT_MODE, secretKeySpecy, ivParameterSpec); 
    cipher.init(Cipher.DECRYPT_MODE, secretKeySpecy); 
    System.out.println("Do final: "+cipherText); 

    cipherText = cipher.doFinal(cipherText); 
    return cipherText; 
} 

public byte[] encrypt(byte[] plainText, byte[] key, byte [] initialVector) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException 
{ 
    Cipher cipher = Cipher.getInstance(cipherTransformation); 
    SecretKeySpec secretKeySpec = new SecretKeySpec(key, aesEncryptionAlgorithm); 
    //IvParameterSpec ivParameterSpec = new IvParameterSpec(initialVector); 
    //cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec); 
    cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec); 
    plainText = cipher.doFinal(plainText); 
    return plainText; 
} 

private byte[] getKeyBytes(String key) throws UnsupportedEncodingException{ 
    byte[] keyBytes= new byte[16]; 
    byte[] parameterKeyBytes= key.getBytes(characterEncoding); 
    System.arraycopy(parameterKeyBytes, 0, keyBytes, 0, Math.min(parameterKeyBytes.length, keyBytes.length)); 
    return keyBytes; 
} 

/// <summary> 
/// Encrypts plaintext using AES 128bit key and a Chain Block Cipher and returns a base64 encoded string 
/// </summary> 
/// <param name="plainText">Plain text to encrypt</param> 
/// <param name="key">Secret key</param> 
/// <returns>Base64 encoded string</returns> 
public String encrypt(String plainText, String key) throws UnsupportedEncodingException, InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException{ 
    byte[] plainTextbytes = plainText.getBytes(characterEncoding); 
    byte[] keyBytes = getKeyBytes(key); 
    //return Base64.encodeToString(encrypt(plainTextbytes,keyBytes, keyBytes), Base64.DEFAULT); 
    return Base64.encodeToString(encrypt(plainTextbytes,keyBytes, new byte[0]), Base64.DEFAULT); 
} 

/// <summary> 
/// Decrypts a base64 encoded string using the given key (AES 128bit key and a Chain Block Cipher) 
/// </summary> 
/// <param name="encryptedText">Base64 Encoded String</param> 
/// <param name="key">Secret Key</param> 
/// <returns>Decrypted String</returns> 
public String decrypt(String encryptedText, String key) throws KeyException, GeneralSecurityException, GeneralSecurityException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, IOException{ 
    byte[] cipheredBytes = Base64.decode(encryptedText, Base64.DEFAULT); 
    byte[] keyBytes = getKeyBytes(key); 
    //return new String(decrypt(cipheredBytes, keyBytes, keyBytes), characterEncoding); 
    return new String(decrypt(cipheredBytes, keyBytes, new byte[0]), characterEncoding); 
} 

}

और यह सांकेतिक शब्दों में बदलना करने के लिए एन PHP में प्रतिक्रिया एन्क्रिप्ट कोड है:

function mc_encrypt($encrypt, $mc_key) { 
    $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB), MCRYPT_RAND); 
    $passcrypt = trim(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $mc_key, trim($encrypt), MCRYPT_MODE_ECB, $iv)); 
    $encode = base64_encode($passcrypt); 
    return $encode; 
} 

function mc_decrypt($decrypt, $mc_key) { 
    $decoded = base64_decode($decrypt); 
    $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB), MCRYPT_RAND); 
    $decrypted = trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $mc_key, trim($decoded), MCRYPT_MODE_ECB, $iv)); 
    return $decrypted; 
} 

मेरा अनुमान है कि इस बात का सेटिंग PHP एन्क्रिप्शन जावा भाग के लिए सेटिंग्स से मेल नहीं खाता है।

03-12 13:44:09.661: W/System.err(15717): javax.crypto.BadPaddingException: pad block corrupted 
+2

क्यों https का उपयोग न करें? – kirilloid

+1

एक बात यह है कि पैडिंग मोड मेल नहीं खाते हैं, देखें http://www.php.net/manual/de/ref.mcrypt.php#69782 – Niko

उत्तर

0

मैं सुझाव है कि आप http://phpaes.com/ पर एक नज़र डालें: Can

मैं निम्न त्रुटि हो रही है। यह एक मुफ्त एईएस एन्क्रिप्शन लाइब्रेरी है जो पूरी तरह से PHP में लागू होती है; यह उपयोग करने के लिए तेज़ और बहुत ही सरल है।

कम से कम, यह आप एक कदम मुद्दे के सही स्रोत को अलग करने की ओर बढ़ते जाएंगे अनुमति देता है।

+1

ध्यान देने योग्य एक और बात: 'बेस 64 एन्कोडिंग' कई अलग-अलग में आता है आकृति और आकार। जब बेस 64 में बाइनरी डेटा एन्कोडिंग की बात आती है, तो आपको पूरी तरह से यह सुनिश्चित करना होगा कि आपके क्लाइंट-साइड और सर्वर-साइड कोड दोनों सही तरीके से काम करते हैं। मैं सुझाव दूंगा कि एन्क्रिप्टेड डेटा से कुछ आसान, अपने परिसर का परीक्षण करना और सुनिश्चित करना कि आपके पास सभी बुनियादी आधार शामिल हैं। – infomaniac

-4

इस उत्तर आप देख रहे हैं नहीं हो सकता है - लेकिन वहाँ एक विशेष कारण आप मैन्युअल रूप से इस डेटा को एन्क्रिप्ट कर रहे हैं के बजाय SSL का उपयोग कर/HTTPS है?

ज्यादातर मामलों HTTPS में मैन्युअल रूप से एक सममित सिफर को लागू करने से लागू करने के लिए आसान और अधिक सुरक्षित हो जाएगा।

+0

एसएसएल/एचटीटीपीएस एक सममित एन्क्रिप्शन को प्रतिस्थापित नहीं करता है और ऐसी स्थितियां हैं जहां एक एसएसएल/एचटीटीपीएस चैनल भी भरोसा नहीं किया जा सकता है। –

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