簡體   English   中英

aes解密\\ 0字符ios

[英]aes decryption \0 character ios

我有一個問題..當我解密從我的php頁面返回的數據時,如果字符串的長度小於16,則將char \\ 0追加到字符串之后。 原始字符串是: 100000065912248我使用此函數解密加密的字符串:

#define FBENCRYPT_ALGORITHM     kCCAlgorithmAES128
#define FBENCRYPT_BLOCK_SIZE    kCCBlockSizeAES128
#define FBENCRYPT_KEY_SIZE      kCCKeySizeAES256

+ (NSData*)decryptData:(NSData*)data key:(NSData*)key iv:(NSData*)iv;
{
    NSData* result = nil;

    // setup key
    unsigned char cKey[FBENCRYPT_KEY_SIZE];
    bzero(cKey, sizeof(cKey));
    [key getBytes:cKey length:FBENCRYPT_KEY_SIZE];

    // setup iv
    char cIv[FBENCRYPT_BLOCK_SIZE];
    bzero(cIv, FBENCRYPT_BLOCK_SIZE);
    if (iv) {
        [iv getBytes:cIv length:FBENCRYPT_BLOCK_SIZE];
    }

    // setup output buffer
    size_t bufferSize = [data length] + FBENCRYPT_BLOCK_SIZE;
    void *buffer = malloc(bufferSize);

    int length = [data length];

    // do decrypt
    size_t decryptedSize = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
                                          FBENCRYPT_ALGORITHM,
                                          0,
                                          cKey,
                                          FBENCRYPT_KEY_SIZE,
                                          cIv,
                                          [data bytes],
                                          [data length],
                                          buffer,
                                          bufferSize,
                                          &decryptedSize);

    if (cryptStatus == kCCSuccess) {
        result = [NSData dataWithBytesNoCopy:buffer length:decryptedSize];
    } else {
        free(buffer);
        NSLog(@"[ERROR] failed to decrypt| CCCryptoStatus: %d", cryptStatus);
    }

    return result;
}

我向函數發送一個nil“ iv”參數,然后在函數中使用“ cIv”,它包含以下內容: 簡歷說明

結果是准確的,但是字符串的長度是16而不是15(字符串:100000065912248)。 實際上,最后一個字符是\\ 0。

為什么? 我該如何解決?

編輯:

PHP加密功能:

function encrypt($plaintext) {

    $key = 'a16byteslongkey!a16byteslongkey!';

    $base64encoded_ciphertext = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $plaintext, MCRYPT_MODE_CBC));
    $base64encoded_ciphertext = trim($base64encoded_ciphertext);

    return $base64encoded_ciphertext;
}

AES是一個塊密碼,用於加密/解密長度為128位(16字節)的塊。 因此,如果數據不是塊大小,則必須添加一些填充。 蘋果公司最受歡迎和支持的是PKCS7。

與PHP的接口必須考慮填充和可能的base64編碼。

解決方案是在PHP和iOS雙方上使用相同的填充。

AES始終在16個字節上運行,沒有選項-因此,如果您有15個字節,則必須添加一個字節,即填充。 據我了解(對PHP加密了解不多),PHP並不是真正的PCKS7padding,最好是自己動手做。 在Wikipedia中查找PKCS7。

如果僅對字符串進行操作,則應該使用零填充(默認),但是如果出於互操作性原因,我建議使用PKCS#7填充。

使用零填充時,純文本將填充00值的字節,但僅在需要時才填充。 這與始終部署的PKCS#7填充不同。 解密后,可以對解密后的純文本使用trim功能。 然后,您應該獲得原始字符串。

這顯然不適用於二進制數據,因為它的結尾可能是trim函數刪除的字符。 請注意,PHP中的trim似乎剝奪了00個字節。 這不是給定的,盡管許多運行時都以這種方式對待,但正式地00不是空格。

您必須從解密的數據中刪除填充

function removePadding($decryptedText){
    $strPad = ord($decryptedText[strlen($decryptedText)-1]);
    $decryptedText= substr($decryptedText, 0, -$strPad);
    return $decryptedText;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM