Swift(iOS)和PHP中AES256加密的结果不同

Swift(iOS)和PHP中AES256加密的结果不同,第1张

概述我在AES256工作,能够使用不安全的渠道在iOS和PHP之间加密/解密. 我已经看到很多类似的问题围绕密钥大小,模式(CBC或ECB),随机iv的使用等等.但在这种情况下,我发现了一个奇怪的行为,如下所示. 两种环境中的配置: – 密钥:32字节(256位) – 块大小:128位(标准) – iv:16字节(静态用于测试目的) – 模式:CBC 如果我加密16或32字节的文本(以匹配AES块大小 我在AES256工作,能够使用不安全的渠道在iOS和PHP之间加密/解密.

我已经看到很多类似的问题围绕密钥大小,模式(CBC或ECB),随机iv的使用等等.但在这种情况下,我发现了一个奇怪的行为,如下所示.

两种环境中的配置:
– 密钥:32字节(256位)
– 块大小:128位(标准)
– iv:16字节(静态用于测试目的)
– 模式:CBC

如果我加密16或32字节的文本(以匹配AES块大小),Swift和PHP中的结果相似但不完全相同:

key = “12345678901234567890123456789012”
plainText = “12345678901234567890123456789012”
iv = “1234567890123456”

Swift cipher = e5RnnlJkv4QGnGhkMwfvgMHr80NWUVhbvvfCdPQ5V2KyKJTx4KfWmn4HXi4dG0b8
PHP cipher = e5RnnlJkv4QGnGhkMwfvgMHr80NWUVhbvvfCdPQ5V2I=

如您所见,PHP Base64字符串的密码长度和最后2个字符存在差异.

但是,如果我使用的文本不是AES128 Block Size乘数,请说“Hello World”,bot环境会报告不同(但大小相同)的密码如下

Swift cipher = bDWO/5C8a+pliIoIXtuzfA==

PHP cipher = oPotHCkxpOwQhIaCz6hNMw==

在这两种情况下(Swift和PHP),无论明文的大小如何,密码都会被正确解密.此外,Swift结果与代码的Objective-C版本一致

附上使用的简化代码:

PHP

$key = "12345678901234567890123456789012";     $iv = "1234567890123456";    $plaintext = "Hello World";    $ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128,$key,$plaintext,MCRYPT_MODE_CBC,$iv);    $ciphertext_base64 = base64_encode($ciphertext);    echo  "ciphertext: ".$ciphertext_base64."</br>";

迅速

let keyData: NSData! = (key as Nsstring).dataUsingEnCoding(NSUTF8StringEnCoding) as NSData!let keyBytes         = UnsafePointer<UInt8>(keyData.bytes)let keyLength        = size_t(kCCKeySizeAES256)let plainData = (plainText as Nsstring).dataUsingEnCoding(NSUTF8StringEnCoding) as NSData!let dataLength    = UInt(plainData.length)let dataBytes     = UnsafePointer<UInt8>(plainData.bytes)var bufferData    = NSMutableData(length: Int(dataLength) + kCCBlockSizeAES128)var bufferPointer = UnsafeMutablePointer<UInt8>(bufferData.mutableBytes)let bufferLength  = size_t(bufferData.length)let operation: Ccoperation = UInt32(kCCEncrypt)let algoritm:  CCAlgorithm = UInt32(kCCAlgorithmAES128)let options = UInt32(kCcoptionPKCS7padding)let ivData: NSData! = (iv as Nsstring).dataUsingEnCoding(NSUTF8StringEnCoding) as NSData!let ivPointer = UnsafePointer<UInt8>(ivData.bytes)var numBytesEncrypted: UInt = 0var cryptStatus = CCCrypt(operation,algoritm,options,keyBytes,keyLength,ivPointer,dataBytes,dataLength,bufferPointer,bufferLength,&numBytesEncrypted)bufferData.length = Int(numBytesEncrypted)let base64cryptString = bufferData.base64EncodedStringWithOptions(.EnCoding64CharacterlineLength)println(base64cryptString)

为什么这些不同?

这是由于填充模式的差异.

如果纯文本不是块大小的N倍,则PHP使用“零填充”.所以PHP填充0..15字节,其值为00,用于128位块密码,例如AES.对于以块边界结束的明文,它不会添加任何填充字节.

大多数其他语言使用PKCS#7填充,填充到下一个块边界,填充字节反映了添加的字节数.所以这将是1..16字节,值为1..16(或十六进制为01到10).对于以块边界结束的明文,它将添加16字节的填充.

PKCS#7填充是确定性的,不依赖于明文值(可以包含任何值的字节,而不仅仅是文本);换句话说,它总是可以独立于内容来应用和删除.

零填充存在以下问题:以00字节结尾的纯文本可能在取消填充期间删除了那些00字节.对于ASCII兼容字符串,这通常不是问题,因为00是控制字符,通常表示文件结束(EOF).

请查看有关mcrypt_encrypt的注释,了解如何将PKCS#7填充应用于PHP.

总结

以上是内存溢出为你收集整理的Swift(iOS)和PHP中AES256加密的结果不同全部内容,希望文章能够帮你解决Swift(iOS)和PHP中AES256加密的结果不同所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1051510.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存