AES128 CTR 加密与 iv

2023-11-29

我想用 iv 和 key 实现 AES128 CTR。我正在寻找如何以最好的方式做到这一点而不是重新发明轮子的建议。

我为此找到了很好的库RNC加密器,但看起来那里不支持这个 aes 。

我也测试this方法,但看起来这不是点击率。

EDIT


我使用了 @zaph 的 zpproach

NSData *result = [NSData cryptData:dataStr
                         operation:kCCEncrypt
                              mode:kCCModeCTR
                         algorithm:kCCAlgorithmAES128
                           padding:ccNoPadding
                         keyLength:kCCKeySizeAES128
                                iv:ivHex
                               key:keyHex
                             error:&error];

但收到CCCryptorCreate status: -4305

刚刚在源码中找到的

@constant kCCUnimplemented Function not implemented for the current algorithm.

Link


您需要使用 CommonCrypto,但不是一次性的CCCrypt版本,而是完整版CCCryptorCreateWithMode, CCCryptorUpdate, CCCryptorFinal and CCCryptorRelease与模式kCCModeCTR版本。

这是我的示例代码,它可能不适合您的需求,您必须在柜台(IV)表格上做出决定。

#import <CommonCrypto/CommonCrypto.h>

+ (NSData *)cryptData:(NSData *)dataIn
            operation:(CCOperation)operation  // kCC Encrypt, Decrypt
                 mode:(CCMode)mode            // kCCMode ECB, CBC, CFB, CTR, OFB, RC4, CFB8
            algorithm:(CCAlgorithm)algorithm  // CCAlgorithm AES DES, 3DES, CAST, RC4, RC2, Blowfish
              padding:(CCPadding)padding      // cc NoPadding, PKCS7Padding
            keyLength:(size_t)keyLength       // kCCKeySizeAES 128, 192, 256
                   iv:(NSData *)iv            // CBC, CFB, CFB8, OFB, CTR
                  key:(NSData *)key
                error:(NSError **)error
{
    if (key.length != keyLength) {
        NSLog(@"CCCryptorArgument key.length: %lu != keyLength: %zu", (unsigned long)key.length, keyLength);
        if (error) {
            *error = [NSError errorWithDomain:@"kArgumentError key length" code:key.length userInfo:nil];
        }
        return nil;
    }

    size_t dataOutMoved = 0;
    size_t dataOutMovedTotal = 0;
    CCCryptorStatus ccStatus = 0;
    CCCryptorRef cryptor = NULL;

    ccStatus = CCCryptorCreateWithMode(operation, mode, algorithm,
                                       padding,
                                       iv.bytes, key.bytes,
                                       keyLength,
                                       NULL, 0, 0, // tweak XTS mode, numRounds
                                       kCCModeOptionCTR_BE, // CCModeOptions
                                       &cryptor);

    if (cryptor == 0 || ccStatus != kCCSuccess) {
        NSLog(@"CCCryptorCreate status: %d", ccStatus);
        if (error) {
            *error = [NSError errorWithDomain:@"kCreateError" code:ccStatus userInfo:nil];
        }
        CCCryptorRelease(cryptor);
        return nil;
    }

    size_t dataOutLength = CCCryptorGetOutputLength(cryptor, dataIn.length, true);
    NSMutableData *dataOut = [NSMutableData dataWithLength:dataOutLength];
    char *dataOutPointer = (char *)dataOut.mutableBytes;

    ccStatus = CCCryptorUpdate(cryptor,
                               dataIn.bytes, dataIn.length,
                               dataOutPointer, dataOutLength,
                               &dataOutMoved);
    dataOutMovedTotal += dataOutMoved;

    if (ccStatus != kCCSuccess) {
        NSLog(@"CCCryptorUpdate status: %d", ccStatus);
        if (error) {
            *error = [NSError errorWithDomain:@"kUpdateError" code:ccStatus userInfo:nil];
        }
        CCCryptorRelease(cryptor);
        return nil;
    }

    ccStatus = CCCryptorFinal(cryptor,
                              dataOutPointer + dataOutMoved, dataOutLength - dataOutMoved,
                              &dataOutMoved);
    if (ccStatus != kCCSuccess) {
        NSLog(@"CCCryptorFinal status: %d", ccStatus);
        if (error) {
            *error = [NSError errorWithDomain:@"kFinalError" code:ccStatus userInfo:nil];
        }
        CCCryptorRelease(cryptor);
        return nil;
    }

    CCCryptorRelease(cryptor);

    dataOutMovedTotal += dataOutMoved;
    dataOut.length = dataOutMovedTotal;

    return dataOut;
}

调用示例:

NSData *dataIn  = [@"DataInDataInData" dataUsingEncoding: NSUTF8StringEncoding];
NSData *key     = [@"KeyKeyKeyKeyKeyK" dataUsingEncoding: NSUTF8StringEncoding];
NSData *counter = [@"CounterCounterCo" dataUsingEncoding: NSUTF8StringEncoding];
NSError *error;
NSData *encrpted = [Crypto
                    cryptData:dataIn
                    operation:kCCEncrypt
                    mode:kCCModeCTR
                    algorithm:kCCAlgorithmAES
                    padding:ccNoPadding
                    keyLength:kCCKeySizeAES128
                    iv:counter
                    key:key
                    error:&error];
NSLog(@"encrypted: %@", encrpted);

Output: encrypted: 064e8073 76973eba 3192474f 9831db34

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AES128 CTR 加密与 iv 的相关文章

随机推荐

  • AccessControlException:访问被拒绝 - FilePermission

    我使用的是JRE7 我已经使用 jarsigner 签署了 jar 文件 但我仍然得到例外 java security AccessControlException access denied java io FilePermission
  • 获取某人的 Steam 库存

    我正在制作一个需要访问用户的 Steam 库存的网站 我找到了一个 API 来获取 Team Fortress 2 库存 Dota 2 CS S CS GO 和 Portal 2 但我没有找到任何用于获取 Steam 库存的 API 是否可
  • 使用 JS/jQuery 获取原始(区分大小写)HTML

    原始 HTML 文本文件中的某处 span span 在浏览器中看起来像这样 span span 如何获得保留案例的原始 html test innerHTML returns lower case Edit 对于那些人来说 好奇为什么 我
  • 是否可以连续制作 DIV 轮播的动画?

    假设红色框代表我的网页容器 并且项目 B C D 位于容器之外 是否可以仅使用 CSS 让项目 A B C D 自动从左向右滚动 就像轮播一样 我在网上看到了如何对图像执行此操作的示例 但不能对充满具有设定宽度的文本的 DIV 执行此操作
  • 在 iOS 应用程序中打开 .ics 文件

    我需要在我的应用程序中打开 ics 文件 我尝试像这样打开它 NSURL path NSBundle mainBundle URLForResource myIcsName withExtension ics UIApplication s
  • 在 Ruby 中删除对象

    假设我有以下课程 class Vehicle total vehicles 0 all instances Array new def initialize total vehicles 1 all instances lt lt self
  • 在Notepad++中编译lisp/scheme

    我现在非常喜欢 lisp 不幸的是我只能在 Windows 上编写代码 是否可以让 Notepad 负责解释我的脚本 并在编译器窗口中显示输出 如果是 哪种解释器最适合使用 Thanks 我赞同查理的建议 获取 Emacs 和 SLIME
  • 像访问数组一样访问 Viewbag?

    想象一个名为 ViewBag Modes 其中包含以下内容 Simple Advanced Manual Complete 如何像在数组中一样通过索引访问 viewbag 例如 Simple 位于索引 0 那么它看起来像这样 ViewBag
  • 使用 BootstrapValidator 重新验证字段

    我从一个新客户那里得到了一个项目 老程序员在这个项目中使用了 BootstrapValidator 0 4 5 问题是我为某些字段构建了自动填充操作 但在自动填充后验证不适用于该字段 或者在自动填充验证后未调用更多excat 验证仅适用于真
  • 从 Powershell 插入 SQL:将空值插入为“空白”

    我正在通过 Powershell 脚本将行插入表中 我循环访问 PSObject 属性包 的集合 并为每个对象插入一行 PSObject 上的每个 noteProperty 对应于表中的一列 其中大多数是字符串 少数是日期 还有一些是布尔值
  • 为 Android 生成 Google 地图密钥 - 一步一步

    以下是我为 Android 生成地图密钥所遵循的步骤 1 我执行这个命令 keytool list v alias androiddebugkey keystore android debug keystore storepass andr
  • 具有共享数据的 Mongodb 数据库架构设计

    你好 我是 mongodb 的新手 我正在使用 java 我的关系表中有 4 个表租户 系统 授权 像这样的东西 Table Fields Tenant Tenant ID PK Tenant INFO System System ID P
  • 跨编译器访问 __m128 字段

    我注意到访问 m128按索引的字段可以在gcc 不使用union trick m128 t float r t 0 t 1 t 2 t 3 我还可以加载一个 m128就像数组一样 m128 t 1 f 2 f 3 f 4 f 这都符合gcc
  • 用于管理意图、实体的 Bluemix Watson Conversation API

    记录的 API 仅允许在配置后与 Watson Conversation 服务进行交互 是否有任何 API 允许配置 例如创建意图 实体等 好问题 我们同意 我们计划很快公开一组较低级别的 API 以解决您的担忧 布莱恩
  • 这个字符串的范围是多少?

    如果我有以下代码 UnicodeString sFish L FISH char szFish AnsiString sFish c str CallFunc szFish 那么临时的范围是什么呢 AnsiString已创建 持续时间是多久
  • 将java应用程序作为后台进程运行

    我已经使用java制作了一个应用程序 当我将其安装在我的计算机上时 我希望它运行为后台进程而不是应用程序 如果任何用户尝试任务管理器 那么他无法在应用程序中找到它 它不应该在应用程序列表中列出 它在进程列表中 所以请告诉我怎样才能做到这一点
  • 适合编写编译器的好语言

    我正在考虑用 haskell 编写一个编译器 为了获得一些知识和经验 我将尝试为现有语言实现编译器 有人可以给我一份适合于此的语言列表吗 提前致谢 Pascal 可能是一个好的开始 您可以一次性编译它 Lisp 的一个子集可能有助于理解 l
  • 使用纹理区域和引擎渲染精灵

    请注意 这是我第一次尝试 Andengine 我一直在尝试使用 libGdx 作为 Android 游戏开发的潜力 但它不适合我的需求 因为我只想为 Android 进行开发 而使用 3D 引擎来完成 2D 工作似乎有点矫枉过正 我现在想尝
  • 解释 SciPy 层次聚类树状图的输出? (也许发现了一个错误......)

    我想弄清楚如何输出scipy cluster hierarchy dendrogram有效 我以为我知道它是如何工作的 并且我能够使用输出来重建树状图 但似乎我不再理解它了 或者有一个错误Python 3该模块的版本 这个答案 如何获取 s
  • AES128 CTR 加密与 iv

    我想用 iv 和 key 实现 AES128 CTR 我正在寻找如何以最好的方式做到这一点而不是重新发明轮子的建议 我为此找到了很好的库RNC加密器 但看起来那里不支持这个 aes 我也测试this方法 但看起来这不是点击率 EDIT 我使