
2 haftadır sunucu ve mobil cihazlar arasındaki şifreleme işlemine kafa yoruyorum ve böyle birşey için bir geliştiricinin önündeki temel sorun tam olarak şöyle : "Hem bütün platformlarda çalışsın hem de düzgün ve uyumlu şifrelesin" :) Şimdilik Android ve IIS arasında bu olayı hallettim.
Uygulamanın android java kısmı :
Gerekli importlar
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
String key = "abc122**"; // secret key'iniz
byte[] keyBytes = key.getBytes();
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "DES");
String iv = "321cba**"; // vector byte'larınız
byte[] ivBytes = iv.getBytes();
IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
try {
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
byte[] encrypted = cipher.doFinal(parameter.getValue().getBytes());
String encryptedBase64 = Base64.encodeBytes(encrypted);
} catch (Exception e) {
e.printStackTrace();
}
ve C# ASP.NET kısmı
byte[] keyBytes = Encoding.UTF8.GetBytes("abc123**"); // secret key
byte[] ivBytes = Encoding.UTF8.GetBytes("321cba**"); // initialization vector
byte[] dataBytes = Convert.FromBase64String(cryptedString);
System.Security.Cryptography.DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
cryptoProvider.Mode = CipherMode.ECB;
MemoryStream memoryStream = new MemoryStream(dataBytes);
CryptoStream cryptoStream = new CryptoStream(memoryStream, cryptoProvider.CreateDecryptor(keyBytes, ivBytes), CryptoStreamMode.Read);
StreamReader reader = new StreamReader(cryptoStream);
string decryptedString = reader.ReadToEnd();
Bu işlemler sırasında dikkat etmeniz gereken iki husus var. Birincisi şifrelenmiş veriyi diğer tarafa Base64 formatında taşımanız ve taşırken aynı zamanda URLEncode işlemine sokmanız. Eğer bunu yapmazsanız hem URL safe olmayan karakterlerle baş edemiyorsunuz hem de veride bozuklık oluyor. Defalarca denemeden sonra Base64 işimi çözdü şükür ki. Diğer husus ise .NET tarafında Mode property'sinin ECB olarak set edilmesi çünkü Java şifrelerken .NET tarafında bu profile uygun şifreliyor. Buna da saatlerimi harcadım malesef :) Neyseki şükür bu da çözüldü :) Sevgiler.