Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在iOS上解密android AES示例_Android_Ios_Encryption_Cryptography_Aes - Fatal编程技术网

在iOS上解密android AES示例

在iOS上解密android AES示例,android,ios,encryption,cryptography,aes,Android,Ios,Encryption,Cryptography,Aes,我有一个关于AES加密/描述的Android示例 我想在iOS上解密这个。这看起来完全不可能。我发现这样做更容易,但失败了: 我甚至没有从base64解码中得到很好的回复。这是我的密码: NSData *encryptedData = [NSData base64DataFromString:encrypted]; // returns null NSData *decryptedData = [encryptedData decryptedAES128DataUsingKey:[[CRYP

我有一个关于AES加密/描述的Android示例

我想在iOS上解密这个。这看起来完全不可能。我发现这样做更容易,但失败了:

我甚至没有从base64解码中得到很好的回复。这是我的密码:

NSData *encryptedData = [NSData base64DataFromString:encrypted];
// returns null
NSData *decryptedData = [encryptedData decryptedAES128DataUsingKey:[[CRYPT_SEED dataUsingEncoding:NSUTF8StringEncoding] SHA256Hash] error:&error];
NSString* result = [[NSString alloc] initWithData:decryptedData encoding:NSUTF8StringEncoding];

这可能是因为公钥不同

有两种东西是加密存储的。第一个是用户名/密码,第二个是消息本身。正确输入密码后,将使用pasword和公钥对消息进行解密

我们称之为公钥的原因是,对于相同的加密方法,密钥是相同的

因此,我认为,也许您应该寻找一个将公钥设置为您选择的字符串的过程


或者您可以使用一种更简单的方法,如公平竞争。

首先,AES是对称密码算法,它需要使用完全相同的密钥进行消息加密和消息解密

我已经检查了您的示例代码,这些是真正困扰我的事情:

  • 不同的键:Android示例不提供任何应该使用的AES键的getter或setter。否则,您将无法在Android和iOS上使用相同的AES密钥
  • 不同的密钥大小:Android示例似乎使用AES-128,而iOS示例似乎使用AES-256
  • 不同的密码模式:iOS示例使用,因此您还需要在设备之间进行交换。然而,在Android示例中,我没有看到任何提供/获取IV的接口
我相信这些是你无法让它工作的主要原因。如果要使用AES,则需要修改代码,以便在两台设备上使用相同的键。在两台设备上使用相同的键。在两台设备上使用相同的键。提示:

  • 您可以使用第三方库来执行此操作。根据库的不同,它可能是跨平台的,因此不同平台上的相同调用将返回相同的结果
安全黑盒:

加密++

  • 您可以编译测试AES例程,以确保Android和iOS上的AES加密和解密例程给出相同的结果

  • 您可以检查Base64是否正确编码和解码。有时可能是Unicode(UTF16)iOS和非Unicode(UTF8)Android的问题。当我做这件事的时候发生在我身上


其他答案所指出的是正确的,这可能归结为不同的键大小/模式/填充。BASE64编码的类型也可能存在问题。在Android上,有两个不同的标志可以产生细微不同的输出。我发现
Base64。没有可用的包装

我也有类似的问题,默认情况下它使用空白,在Android/Java上,如果不指定一个,似乎会生成一个随机的

下面是我如何指定一个空白IV,以便iOS能够解密:

private static byte[] ivBytes = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };

final Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);

cipherText = cipher.doFinal(stuffIWantSafe.getBytes("UTF-8"));

String encodedCipherText = Base64.encodeToString(cipherText, Base64.NO_WRAP);
免责声明:从安全角度来看,我不建议使用空白的IV,因为这样可以更好地使用随每条消息变化的IV


*更新:刚刚发布的AESCrypt

您必须为iOS和android使用相同的加密模式和填充,才能正常工作。您需要了解一些有关加密的知识,确定android代码使用的选项和输入,并在iOS代码中复制它们。CommonCrypto是你的朋友,认识他吧。在不理解的情况下使用加密可能会产生一个结果。这是真的。但目标不是完全保护数据,而是延迟潜在的黑客。我只是想为一个临时项目提供一个加密的提要。我刚刚在中发布了一个可接受的答案。可能有重复的请上传投票并将我的答案作为正确答案勾选:)