大佬教程收集整理的这篇文章主要介绍了iOS和Android中的AES加密,以及C#.NET中的解密,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
以下是我的Android加密:
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,keyBytes,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; }@H_874_5@然后我用C#解密它:
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,len); rijndaelCipher.Key = keyBytes; rijndaelCipher.IV = keyBytes; byte[] plaintext = rijndaelCipher.CreateDecryptor().TransformFinalBlock(encryptedData,encryptedData.Length); return encoding.GetString(plaintext); }@H_874_5@这样做就像一个魅力,但是当我在iOS中尝试这样做时,问题就出现了.我是iphone / ipad的新开发应用程序,所以我去搜索它,几乎所有提供的代码示例如下:
- (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;@H_874_5@}
也许我有点太乐观了,当我希望在这里顺利过渡,因为当Android正在扔我的东西像:
“EgQVKvCLS4VKLoR0xEGexA ==”
那么iOS给了我:
"yP42c9gajUra7n0zSEuVJQ=="@H_874_5@希望这只是我忘记的东西,还是一些设置错了?
你也有一个重大的安全问题,因为你使用你的钥匙作为你的IV(见下文更多,这实际上是你的症状的原因).这不是选择IV的正确方法,并使您的密文可以预见.使用相同密钥加密的相同明文将给出相同的结果.这根本就没有Ⅳ. IV需要随机.请参阅上述链接以获得更多的讨论.
现在到你的实际症状问题是你在Java和C#中使用的是IV,但是你在iOS上使用了0(NULL)作为IV(IV不是可选的,你只是传递0).在所有情况下,您都需要使用相同的IV.
以上是大佬教程为你收集整理的iOS和Android中的AES加密,以及C#.NET中的解密全部内容,希望文章能够帮你解决iOS和Android中的AES加密,以及C#.NET中的解密所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。