AES ECB iOS加密

博格丹·科达(Bogdan Korda)

我尝试使用带有ECB选项的AES算法加密一些字符串。

size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);

size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionECBMode,
                                      encryptionKey, kCCKeySizeAES128,
                                      NULL /* initialization vector (optional) */,
                                      [self bytes], dataLength, /* input */
                                      buffer, bufferSize, /* output */
                                      &numBytesEncrypted);
if (cryptStatus == kCCSuccess) {
    return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}

但是func返回kCCAlignmentError(-4303)

然后,我尝试对齐数据:

unsigned long diff = kCCKeySizeAES128 - (dataLength % kCCKeySizeAES128);
unsigned long newSize = 0;

if (diff > 0) {
    newSize = dataLength + diff;
}

char dataPtr[newSize];
memcpy(dataPtr, [self bytes], [self length]);
for(int i = 0; i < diff; i++) {
    dataPtr[i + dataLength] = 0x20;
}

size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionECBMode,
                                      encryptionKey, kCCKeySizeAES128,
                                      NULL /* initialization vector (optional) */,
                                      dataPtr, sizeof(dataPtr), /* input */
                                      buffer, bufferSize, /* output */
                                      &numBytesEncrypted);

输入字符串

"test_string,test2"

结果是

jxtFOhYpgBVieM90zx9oDanqBkcsVAvRRJsM4GL3cio=

在Android上的结果是

jxtFOhYpgBVieM90zx9oDUfV7v43WFv7F5bzErfxrL8=

我怎么了

扎夫

简单来说,AES是一个块密码,这意味着它要求输入数据必须是块大小的倍数(AES为16字节)。您的输入数据为17个字节,因此对齐错误。(它不是在谈论内存中的对齐方式)。

处理此问题的方法是在选项中指定PKCS#7填充:

kCCOptionPKCS7Padding | kCCOptionECBMode

输入数据将被填充为一个块的倍数,解密时将删除填充。为了允许进行加密,必须将输出缓冲区增加一个块大小。

考虑不使用[ECB模式](https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Electronic_Codebook_.28ECB.29(向下滚动到企鹅),它不安全。

如果您在Android上使用mcrypt:do n't,则它是废弃软件,不支持标准填充,仅支持空填充。而是考虑使用defuseRNCryptor,这是适用于iOS和Java的完全安全的实现。

如果确实使用mcrypt,则需要添加自己的PKCS#7 padding

这是示例代码:

+ (NSData *)doCipher:(NSData *)dataIn
                 key:(NSData *)symmetricKey
             context:(CCOperation)encryptOrDecrypt // kCCEncrypt or kCCDecrypt
{
    CCCryptorStatus ccStatus   = kCCSuccess;
    size_t          cryptBytes = 0;    // Number of bytes moved to buffer.
    NSMutableData  *dataOut    = [NSMutableData dataWithLength:dataIn.length + kCCBlockSizeAES128];

    ccStatus = CCCrypt( encryptOrDecrypt,
                       kCCAlgorithmAES128,
                       kCCOptionPKCS7Padding | kCCOptionECBMode,
                       symmetricKey.bytes, 
                       kCCKeySizeAES128,
                       0,
                       dataIn.bytes, dataIn.length,
                       dataOut.mutableBytes, dataOut.length,
                       &cryptBytes);

    if (ccStatus != kCCSuccess) {
        NSLog(@"CCCrypt status: %d", ccStatus);
    }

    dataOut.length = cryptBytes;

    return dataOut;
}

PHP PKCS#7填充示例:
添加PKCS#7填充

$padLength = $blockSize - (strlen($clearText) % $blockSize);
$clearText = $clearText . str_repeat(chr($padLength), $padLength);

带状PKCS#7填充

$padLength = ord($cryptText[strlen($cryptText)-1]);
$cryptText = substr($cryptText, 0, strlen($cryptText) - $padLength);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

AES ECB加密组

来自分类Dev

AES加密256 ECB模式

来自分类Dev

用于ECB AES的Linux内核加密API

来自分类Dev

用Java加密/解密“ AES / ECB / PKCS5Padding”

来自分类Dev

用Java加密/解密“ AES / ECB / PKCS5Padding”

来自分类Dev

AES 128位ECB加密密文溢出

来自分类Dev

使用 AES/ECB/NoPadding 与 PKCS5Padding 进行加密

来自分类Dev

AES-ECB加密(Python Crypto.Cipher和openssl之间的区别)

来自分类Dev

在某些情况下,使用AES ECB模式'BadPaddingException'进行加密和解密

来自分类Dev

使用ECB操作模式的OpenSSL库进行AES-256加密

来自分类Dev

无法复制从Java到PHP中使用AES / ECB / PKCS5Padding加密方法

来自分类Dev

使用ECB模式的CryptoJS AES加密在相同的参数下产生不同的结果

来自分类Dev

Pycrypto:在ECB模式下使用AES进行“双重加密”不会产生纯文本

来自分类Dev

我正在使用 AES ECB 256 填充 - 加密发送数据,但我无法实现解密

来自分类Dev

Node.js / javascript像AES中的mcrypt_ecb一样加密AES-128

来自分类Dev

CryptoJS AES 256 ECB解密

来自分类Dev

AES / ECB解密数据的大小

来自分类Dev

如何使用NodeJS中的aes-256-ecb正确加密字符串并使用OpenSSL的命令行解密?

来自分类Dev

AES256在目标C中加密以使用PHP rijndael_256 ECB_MODE进行处理

来自分类Dev

如何使用NodeJS中的aes-256-ecb正确加密字符串并使用OpenSSL的命令行解密?

来自分类Dev

用python中的AES生成ECB企鹅

来自分类Dev

使用WolfCrypt的ECB模式下的AES

来自分类Dev

使用WolfCrypt的ECB模式下的AES

来自分类Dev

iOS上的RSA加密(RSA / ECB / PKCS1Padding)

来自分类Dev

Java 加密 TwoFish 模式 ECB

来自分类Dev

AES加密/解密iOs和.Net

来自分类Dev

在iOS中实现AES256加密

来自分类Dev

如何使用20byte密钥进入AES ECB模式

来自分类Dev

AES-128-ECB解密:输入数据不是完整的块

Related 相关文章

  1. 1

    AES ECB加密组

  2. 2

    AES加密256 ECB模式

  3. 3

    用于ECB AES的Linux内核加密API

  4. 4

    用Java加密/解密“ AES / ECB / PKCS5Padding”

  5. 5

    用Java加密/解密“ AES / ECB / PKCS5Padding”

  6. 6

    AES 128位ECB加密密文溢出

  7. 7

    使用 AES/ECB/NoPadding 与 PKCS5Padding 进行加密

  8. 8

    AES-ECB加密(Python Crypto.Cipher和openssl之间的区别)

  9. 9

    在某些情况下,使用AES ECB模式'BadPaddingException'进行加密和解密

  10. 10

    使用ECB操作模式的OpenSSL库进行AES-256加密

  11. 11

    无法复制从Java到PHP中使用AES / ECB / PKCS5Padding加密方法

  12. 12

    使用ECB模式的CryptoJS AES加密在相同的参数下产生不同的结果

  13. 13

    Pycrypto:在ECB模式下使用AES进行“双重加密”不会产生纯文本

  14. 14

    我正在使用 AES ECB 256 填充 - 加密发送数据,但我无法实现解密

  15. 15

    Node.js / javascript像AES中的mcrypt_ecb一样加密AES-128

  16. 16

    CryptoJS AES 256 ECB解密

  17. 17

    AES / ECB解密数据的大小

  18. 18

    如何使用NodeJS中的aes-256-ecb正确加密字符串并使用OpenSSL的命令行解密?

  19. 19

    AES256在目标C中加密以使用PHP rijndael_256 ECB_MODE进行处理

  20. 20

    如何使用NodeJS中的aes-256-ecb正确加密字符串并使用OpenSSL的命令行解密?

  21. 21

    用python中的AES生成ECB企鹅

  22. 22

    使用WolfCrypt的ECB模式下的AES

  23. 23

    使用WolfCrypt的ECB模式下的AES

  24. 24

    iOS上的RSA加密(RSA / ECB / PKCS1Padding)

  25. 25

    Java 加密 TwoFish 模式 ECB

  26. 26

    AES加密/解密iOs和.Net

  27. 27

    在iOS中实现AES256加密

  28. 28

    如何使用20byte密钥进入AES ECB模式

  29. 29

    AES-128-ECB解密:输入数据不是完整的块

热门标签

归档