मैं एंड्रॉइड और आईफोन प्लेटफ़ॉर्म दोनों पर एईएस एल्गोरिदम का उपयोग करके कुछ टेक्स्ट एन्क्रिप्ट करने की कोशिश कर रहा हूं। मेरी समस्या यह है कि, एक ही एन्क्रिप्शन/डिक्रिप्शन एल्गोरिदम (एईएस-128) और एक ही निश्चित चर (कुंजी, चतुर्थ, मोड) का उपयोग करके, मुझे दोनों प्लेटफार्मों पर अलग-अलग परिणाम मिलते हैं। मैं दोनों प्लेटफॉर्म से कोड नमूने शामिल कर रहा हूं, जिसका उपयोग मैं एन्क्रिप्शन/डिक्रिप्शन का परीक्षण करने के लिए कर रहा हूं। मैं यह निर्धारित करने में कुछ मदद की सराहना करता हूं कि मैं क्या गलत कर रहा हूं।एंड्रॉइड और आईफोन में एईएस-128 का उपयोग करके एन्क्रिप्शन (विभिन्न परिणाम)
- कुंजी: "123456789abcdefg"
- चतुर्थ: "1111111111111111"
- सादा पाठ: "HelloThere"
- मोड: "एईएस/सीबीसी/NoPadding"
एंड्रॉयड कोड:
public class Crypto {
private final static String HEX = "ABCDEF";
public static String encrypt(String seed, String cleartext)
throws Exception {
byte[] rawKey = getRawKey(seed.getBytes());
byte[] result = encrypt(rawKey, cleartext.getBytes());
return toHex(result);
}
public static String decrypt(String seed, String encrypted)
throws Exception {
byte[] rawKey = getRawKey(seed.getBytes());
byte[] enc = toByte(encrypted);
byte[] result = decrypt(rawKey, enc);
return new String(result);
}
private static byte[] getRawKey(byte[] seed) throws Exception {
KeyGenerator kgen = KeyGenerator.getInstance("CBC");
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
sr.setSeed(seed);
kgen.init(128, sr); // 192 and 256 bits may not be available
SecretKey skey = kgen.generateKey();
byte[] raw = skey.getEncoded();
return raw;
}
private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(clear);
return encrypted;
}
private static byte[] decrypt(byte[] raw, byte[] encrypted)
throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] decrypted = cipher.doFinal(encrypted);
return decrypted;
}
public static String toHex(String txt) {
return toHex(txt.getBytes());
}
public static String fromHex(String hex) {
return new String(toByte(hex));
}
public static byte[] toByte(String hexString) {
int len = hexString.length()/2;
byte[] result = new byte[len];
for (int i = 0; i < len; i++)
result[i] = Integer.valueOf(hexString.substring(2 * i, 2 * i + 2),
16).byteValue();
return result;
}
public static String toHex(byte[] buf) {
if (buf == null)
return "";
StringBuffer result = new StringBuffer(2 * buf.length);
for (int i = 0; i < buf.length; i++) {
appendHex(result, buf[i]);
}
return result.toString();
}
private static void appendHex(StringBuffer sb, byte b) {
sb.append(HEX.charAt((b >> 4) & 0x0f)).append(HEX.charAt(b & 0x0f));
}
}
IPhone (ऑब्जेक्टिव-सी) कोड:
- (NSData *) transform:(CCOperation) encryptOrDecrypt data:(NSData *) inputData {
NSData* secretKey = [Cipher md5:cipherKey];
CCCryptorRef cryptor = NULL;
CCCryptorStatus status = kCCSuccess;
uint8_t iv[kCCBlockSizeAES128];
memset((void *) iv, 0x0, (size_t) sizeof(iv));
status = CCCryptorCreate(encryptOrDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
[secretKey bytes], kCCKeySizeAES128, iv, &cryptor);
if (status != kCCSuccess) {
return nil;
}
size_t bufsize = CCCryptorGetOutputLength(cryptor, (size_t)[inputData length], true);
void * buf = malloc(bufsize * sizeof(uint8_t));
memset(buf, 0x0, bufsize);
size_t bufused = 0;
size_t bytesTotal = 0;
status = CCCryptorUpdate(cryptor, [inputData bytes], (size_t)[inputData length],
buf, bufsize, &bufused);
if (status != kCCSuccess) {
free(buf);
CCCryptorRelease(cryptor);
return nil;
}
bytesTotal += bufused;
status = CCCryptorFinal(cryptor, buf + bufused, bufsize - bufused, &bufused);
if (status != kCCSuccess) {
free(buf);
CCCryptorRelease(cryptor);
return nil;
}
bytesTotal += bufused;
CCCryptorRelease(cryptor);
return [NSData dataWithBytesNoCopy:buf length:bytesTotal];
}
+ (NSData *) md5:(NSString *) stringToHash {
const char *src = [stringToHash UTF8String];
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5(src, strlen(src), result);
return [NSData dataWithBytes:result length:CC_MD5_DIGEST_LENGTH];
}
मेरे संदर्भ में से कुछ:
- http://code.google.com/p/aes-encryption-samples/wiki/HowToEncryptWithJava
- http://automagical.rationalmind.net/2009/02/12/aes-interoperability-between-net-and-iphone/
- AES interoperability between .Net and iPhone?
कौन सा 'एन्क्रिप्ट()' विधि आप उपयोग कर रहे हैं? आपका सवाल एक गड़बड़ है। केवल आवश्यक कोड प्रदान करें। – erickson
आप इस समाधान का उपयोग कर सकते हैं, यह मेरे लिए काम: http://stackoverflow.com/questions/17535918/aes-gets-different-results: [1] [1] [लिंक यहाँ विवरण दर्ज] -इन-आईओएस-एंड-जावा? answertab = सक्रिय # टैब-टॉप – salimido
आपको एन्क्रिप्टेड डेटा को बराबर होने की आवश्यकता क्यों है? शायद आप बिना किसी कारण के अपने कोड को कम सुरक्षित बना देंगे। अधिकांश उपयोग मामलों में केवल डिक्रिप्ट डेटा बराबर होना चाहिए। देखें crypto.stackexchange.com/q/5094 –