İlk şey ilk. Bir süre önce bir şifreyi şifrelemek ve şifrenin şifresi çözülmüş bir .net web hizmeti için bir parametre olarak göndermek için Android'de basit bir AES şifrelemesine ihtiyacım vardı.AES şifreleme ve şifre çözme C# .NET
aşağıdaki benim Android şifreleme geçerli:
private static String Encrypt(String text, String key)
throws Exception {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
byte[] keyBytes= new byte[16];
byte[] b= key.getBytes("UTF-8");
int len= b.length;
if (len > keyBytes.length) len = keyBytes.length;
System.arraycopy(b, 0, keyBytes, 0, len);
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
IvParameterSpec ivSpec = new IvParameterSpec(keyBytes);
cipher.init(Cipher.ENCRYPT_MODE,keySpec,ivSpec);
byte[] results = cipher.doFinal(text.getBytes("UTF-8"));
String result = Base64.encodeBytes(results);
return result;
}
Ve sonra birlikte C# bunu deşifre:
public static string Decrypt(string textToDecrypt, string key)
{
System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
RijndaelManaged rijndaelCipher = new RijndaelManaged();
rijndaelCipher.Mode = CipherMode.CBC;
rijndaelCipher.Padding = PaddingMode.PKCS7;
rijndaelCipher.KeySize = 0x80;
rijndaelCipher.BlockSize = 0x80;
string decodedUrl = HttpUtility.UrlDecode(textToDecrypt);
byte[] encryptedData = Convert.FromBase64String(decodedUrl);
byte[] pwdBytes = Encoding.UTF8.GetBytes(key);
byte[] keyBytes = new byte[0x10];
int len = pwdBytes.Length;
if (len > keyBytes.Length)
{
len = keyBytes.Length;
}
Array.Copy(pwdBytes, keyBytes, len);
rijndaelCipher.Key = keyBytes;
rijndaelCipher.IV = keyBytes;
byte[] plainText = rijndaelCipher.CreateDecryptor().TransformFinalBlock(encryptedData, 0, encryptedData.Length);
return encoding.GetString(plainText);
}
Bu harika çalıştı
ama yapmam çalıştığımda sorunlar geldi iOS'ta aynı. Ben googled Ofcause yüzden iphone/ipad için oldukça yeni gelişen uygulamalar duyuyorum ve neredeyse sağlanan her kod örneği aşağıdaki oldu:
- (NSData *)AESEncryptionWithKey:(NSString *)key {
char keyPtr[kCCKeySizeAES128]; // room for terminator (unused)
bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)
// fetch key data
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [self length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
keyPtr, kCCKeySizeAES128,
NULL /* initialization vector (optional) */,
[self bytes], [self length], /* input */
buffer, bufferSize, /* output */
&numBytesEncrypted);
if (cryptStatus == kCCSuccess) {
//the returned NSData takes ownership of the buffer and will free it on deallocation
return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}
free(buffer); //free the buffer;
return nil;
}
Belki biraz fazla iyimser olduğunu, ne zaman
:"EgQVKvCLS4VKLoR0xEGexA=="
sonra iOS bana verir: Android bana böyle bir şey atıyor zaman çünkü burada sorunsuz bir geçiş için umuyordum
"yP42c9gajUra7n0zSEuVJQ=="
Umarım unuttuğum bir şey mi var, yoksa bazı ayarlar yanlış mı?
[UPDATE] Sonuçlar artık base64 kodlamasından sonra gösteriliyor.
Android sürümü, "YHH + gTxyIxvAx1cPFLcP0IEW2HcVHQVi9X11656CFsk =" '(60 71 fe 81 3c 72 23 1b c0 c7 57 0f 14 b7 0f d0 81 16 d8 77 15 1d 05 62'ye eşit olan bir URL kodlu base64 dizesidir. f5 7d 75 eb 9e 82 16 c9) '. – Joe
Woops, üzgünüm, bundan bahsetmeyi unuttum. Diğer bir yöntemde, iOS sürümünden de sonuçları kodluyorum, ancak kodlamadan önce sonuçlar farklı. – Morten
Soruyu base64 kodlamasından sonraki sonuçları gösterecek şekilde güncellendi. Aynı şifre ve aynı anahtar kullanılır. – Morten