当前位置: 首页 > 知识库问答 >
问题:

在iOS Swift中使用CBC模式进行AES 128解密

陆文博
2023-03-14

我使用< code>CommonCrypto来解密从服务器获取的加密MP3文件。实际上,服务器端使用带有CBC模式和< code>PKCS5Padding的AES 128位加密。所以我想用同样的方式解密它。

我使用下面的代码进行解密。

    #import <CommonCrypto/CommonCrypto.h

func testCrypt(data:NSData, keyData:NSData, ivData:NSData, operation:CCOperation) -> NSData? {
    let keyBytes = UnsafePointer<UInt8>(keyData.bytes)
    print("keyLength   = \(keyData.length), keyData   = \(keyData)")

    let ivBytes = UnsafePointer<UInt8>(ivData.bytes)
    print("ivLength    = \(ivData.length), ivData    = \(ivData)")

    let dataLength = Int(data.length)
    let dataBytes  = UnsafePointer<UInt8>(data.bytes)
    print("dataLength  = \(dataLength), data      = \(data)")

    let cryptData: NSMutableData! = NSMutableData(length: Int(dataLength) + kCCBlockSizeAES128)
    let cryptPointer = UnsafeMutablePointer<UInt8>(cryptData.mutableBytes)
    let cryptLength  = size_t(cryptData.length)

    let keyLength              = size_t(kCCKeySizeAES128)
    let algoritm:  CCAlgorithm = UInt32(kCCAlgorithmAES128)
    let options:   CCOptions   = UInt32(kCCOptionPKCS7Padding)

    var numBytesEncrypted :size_t = 0

    let cryptStatus = CCCrypt(operation,
        algoritm,
        options,
        keyBytes, keyLength,
        ivBytes,
        dataBytes, dataLength,
        cryptPointer, cryptLength,
        &numBytesEncrypted)

    if UInt32(cryptStatus) == UInt32(kCCSuccess) {
        cryptData.length = Int(numBytesEncrypted)
        print("cryptLength = \(numBytesEncrypted), cryptData = \(cryptData)")

    } else {
        print("Error: \(cryptStatus)")
    }

    return cryptData;
}

如何在此代码中指定CBC模式和PKCS5填充

预先感谢

共有1个答案

姜钧
2023-03-14

AES的块大小始终使用16个字节。而PKCS5Padd的块大小定义为8个字节。因此您不能使用像AES/CBC/PKCS5Padd这样的组合。您只能在块大小不超过8个字节时使用PKCS5Padd

其他事情

<code>CCCrypt</code>默认在<code>CBC</code>模式下工作,因此在这种情况下,您无需提及<code>的CBC</code>模式。例如,如果您想<code>ECB</code>模式,那幺您应该提到<code>kCCOptionECBMode</code>

不幸的是,苹果文档没有 PKCS5填充 。您可以使用 PKCS7 填充替代方案 PKCS5 填充,当您的块大小正好为 8 字节时。

 类似资料:
  • 我只想用这3种模式测试openSSL中的AES:128192和256密钥长度,但我解密的文本与我的输入不同,我不知道为什么。此外,当我传递一个巨大的输入长度(比如1024字节)时,我的程序显示。。。我的意见总是一样的,但这并不重要,至少现在是这样。代码如下: 编辑: 当我将输出大小更改为而不是时,我得到了结果: 那么,是否有可能存在Outpus大小和IV大小的问题?它们应该有什么尺寸(AES-CB

  • 我一直在搜索一个Java代码示例来执行以下操作,但没有成功。我正在为我的特殊情况寻找解决办法。 已使用“testtest”为密码生成密钥和IV: 我可以访问加密文件,盐,钥匙和IV。我不相信我会收到密码。此外,我还安装了无限强度JCE策略。到目前为止,我只找到了另一个java程序进行加密并生成这些参数的示例。对于我的情况,我必须使用salt、key和iv值来解密一个文件。这在Java中是可能的吗?

  • 我在使用java AES/CBC/PKCS7Padding加密时遇到了问题。我已经在使用提供程序之前进行搜索和跟踪。但我还是无法得到正确的加密 假设要求是: 加密类型:对称 算法:AES 块大小=128Bit(16字节) 密码模式:CBC 填充模式:PKCS7 加密密钥长度:256 Bit(32字节) 向量初始化长度(IV):128 Bit(16字节) 示例: 普通数据=ABC123 加密数据(b

  • 我已经设法使它能够处理不包含og a-zA-Z0-9之外的字符和一些特殊字符的文本,但如果我使用丹麦字母,如ielouangØ,解密的文本会显示?而不是实际的字母。所有文件都保存为UTF-8,头字符集=UTF-8 Javascript - input: "tester for php: 我试过选项0,OPENSSL_ZERO_PADDING和OPENSSL_RAW_DATA,结果相同。有人能帮我吗

  • 问题内容: 我在另一个文件中有一个XML文件和一个XML模式,我想验证我的XML文件是否遵循该模式。如何在Python中执行此操作? 我希望使用标准库,但是如果需要,我可以安装第三方程序包。 问题答案: 我假设您的意思是使用XSD文件。令人惊讶的是,没有太多支持此功能的python XML库。但是,lxml确实可以。使用lxml检查验证。该页面还列出了如何使用lxml与其他架构类型进行验证。

  • 我必须在PHP中以AES CTS模式(密文窃取,有时称为AES-XTS)加密和解密数据,以便与用NET平台。英寸NET 4,本机支持这种模式。 对于PHP,我找不到解决方案,根据手册,mcrypt似乎不支持这种模式。 任何人都可以解释一下普通CBC和CBC-CTS之间的区别吗?是否可以使用现有的模块/库使后者在PHP中工作?