Utiliser AES pour chiffrer avec Objective-C et décrypter avec PHP
Je veux utiliser AES pour crypter un mot de passe en Objective-C, puis déchiffrer en PHP, mais j'ai deux problèmes.
- Je crypter le mot de passe, mais c'est un
NSData
objet, j'ai donc coder avec base64, mais quand je décoder en PHP, le résultat estnil
. Donc je ne peux pas déchiffrer. - Je peux chiffrer et de déchiffrer le mot de passe en Objective-C, donc c'est le PHP qui est le problème, mais quand j'ai chiffrer avec AES et ensuite encoder en base64, les résultats ne sont pas les mêmes.
Voici mon code:
PHP:
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$key = "a16byteslongkey!";
$plaintext = "iphone";
$ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $plaintext, MCRYPT_MODE_ECB, $iv);
$ciphertext = base64_encode($ciphertext);
echo "ciphertext: ".$ciphertext."<br/>";
$ciphertext = base64_decode($ciphertext);
$plaintext = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $ciphertext, MCRYPT_MODE_ECB, $iv);
echo "plaintext: ".$plaintext."<br/>";
de sortie:
ciphertext: SXNepKfh0IrlDDdkq4EdmQ==
plaintext: iphone
Objective-C: (Obtenir le code source complet ici: https://gist.github.com/838614)
NSString *key = @"a16byteslongkey!";
NSString *plaintext = @"iphone";
NSString *ciphertext = [plaintext AES256EncryptWithKey: key];
NSLog(@"ciphertext: %@", ciphertext);
plaintext = [ciphertext AES256DecryptWithKey: key];
NSLog(@"plaintext: %@", plaintext);
de sortie:
ciphertext: D19l3gsgXJlrLl7B2oCT6g==
plaintext: iphone
- je remplacer kCCKeySizeAES256 avec kCCKeySizeAES128, et de remplacer "kCCOptionPKCS7Padding" avec "kCCOptionPKCS7Padding | kCCOptionECBMode",
Dès le départ, on dirait que vous êtes à l'aide de 128 en PHP et 256 en Obj-C... Qui va être un problème.
merci de vous répondre, j'ai remplacer kCCKeySizeAES256 avec kCCKeySizeAES128, et de remplacer "kCCOptionPKCS7Padding" avec "kCCOptionPKCS7Padding & kCCOptionECBMode", mais les résultats ne sont également pas les mêmes. est-il un détail que je devrait changer?
vous semblez être
peut-être que vous devriez jeter un oeil à NSString+AESCrypt.m, il encoder en base64 "- (NSString *)AES256EncryptWithKey:(NSString *)"
merci de vous répondre, j'ai remplacer kCCKeySizeAES256 avec kCCKeySizeAES128, et de remplacer "kCCOptionPKCS7Padding" avec "kCCOptionPKCS7Padding & kCCOptionECBMode", mais les résultats ne sont également pas les mêmes. est-il un détail que je devrait changer?
vous semblez être
base64_encode
-ing, la chaîne résultante en PHP, mais seulement convertir en UTF8 en Obj-C. Évidemment, les résultats seront différents.peut-être que vous devriez jeter un oeil à NSString+AESCrypt.m, il encoder en base64 "- (NSString *)AES256EncryptWithKey:(NSString *)"
OriginalL'auteur pcrazyc | 2011-08-23
Vous devez vous connecter pour publier un commentaire.
j'ai slove le problème.
objective-c:
de sortie:
php:
de sortie:
OriginalL'auteur pcrazyc
fixe utiliser quelque chose comme
J'ai essayé de tester avec cette chaîne:
$plaintex = "fskfladsadsadfsfs dfskl;dfs a jadfsa ds'a' j afdjdfsaadfs' jdfas af 'ksfegfffffffffffffffffffffsdfsfgfsfdsdfddfsg"
et les résultats sont différents. Quelqu'un ici sait ce que la raison pourrait être?
OriginalL'auteur phuongho
Je soupçonne que c'est le remplissage de la routine. J'ai abordé ce problème en faisant en sorte que le texte chiffré est rembourré à 32 caractères avec des espaces, et avant que le résultat est retourné à partir de teh routine de déchiffrement, coupez les espaces supplémentaires.
Il y a de officiel rembourrage algorithmes, mais j'ai trouvé qu'ils n'ont pas de travail. Si vous chiffrer une chaîne qui est un multiple de 32 caractères de long, alors même si le rembourrage de routine est mauvais, cela va l'ignorer.
OriginalL'auteur user462990