在目标 c 中生成初始化向量

2023-12-09

java代码是

Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");

byte[] ivBytes = new byte[c.getBlockSize()];
String IV = CryptoUtils.hexEncode(ivBytes);

它给出随机 16 字节响应,例如

563ffcecaa43753bd09613095ad24a12。

如何将相应的代码写入objective c中?

我有一些目标 C 代码 -

 - (NSData *)createCipher:(NSString*)data WithKey:(NSString*)key {
 NSData* result = nil;

 // setup key
 unsigned char cKey[kCCKeySizeAES256]; // room for terminator (unused)
 bzero(cKey, sizeof(cKey)); // fill with zeroes (for padding)
 [key getBytes:cKey length:kCCKeySizeAES256];

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

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

 // do encrypt
 size_t encryptedSize = 0;
 CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, //CCOperation op
 kCCAlgorithmAES128, //CCAlgorithm alg
 kCCOptionPKCS7Padding, //CCOptions
 cKey, //const void *key
 kCCKeySizeAES256, //size_t keyLength
 cIv, // optional initialization vector
 [data bytes], // optional per op and alg
 [data length],
 buffer, // data RETURNED here
 bufferSize,
 &encryptedSize);


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

 return result;
 }

但是,这段代码是用来加密数据的,现在如何生成IV?


只需为 IV 生成随机字节:

int             ivLength   = kCCBlockSizeAES128;
NSMutableData  *ivData = [NSMutableData dataWithLength:kCCBlockSizeAES128];
SecRandomCopyBytes(kSecRandomDefault, ivLength, ivData.mutableBytes);

这将产生适合的数据CCCrypt,只需使用ivData.bytes.

ivData 的用法示例:

ccStatus = CCCrypt(
                   ...
                   ivData.bytes,
                   ...
                  );

在加密时生成随机 IV 并将其作为加密数据前缀传递以进行解密的完整示例:

+ (NSData *)aesCBCEncrypt:(NSData *)data
                         key:(NSData *)key
                       error:(NSError **)error
{
    if (key.length != 16 && key.length != 24 && key.length != 32) {
        *error = [NSError errorWithDomain:@"keyLengthError" code:-1 userInfo:nil];
        return nil;
    }

    CCCryptorStatus ccStatus   = kCCSuccess;
    int             ivLength   = kCCBlockSizeAES128;
    size_t          cryptBytes = 0;
    NSMutableData  *dataOut     = [NSMutableData dataWithLength:ivLength + data.length + kCCBlockSizeAES128];

    int status = SecRandomCopyBytes(kSecRandomDefault, ivLength, dataOut.mutableBytes);
    if (status != 0) {
        *error = [NSError errorWithDomain:@"ivError" code:status userInfo:nil];
        return nil;
    }
    ccStatus = CCCrypt(kCCEncrypt,
                       kCCAlgorithmAES,
                       kCCOptionPKCS7Padding,
                       key.bytes, key.length,
                       dataOut.bytes,
                       data.bytes, data.length,
                       dataOut.mutableBytes + ivLength, dataOut.length,
                       &cryptBytes);

    if (ccStatus == kCCSuccess) {
        dataOut.length = cryptBytes + ivLength;
    }
    else {
        if (error) {
            *error = [NSError errorWithDomain:@"kEncryptionError" code:ccStatus userInfo:nil];
        }
        dataOut = nil;
    }

    return dataOut;
}

+ (NSData *)aesCBCDecrypt:(NSData *)data
                         key:(NSData *)key
                       error:(NSError **)error
{
    if (key.length != 16 && key.length != 24 && key.length != 32) {
        *error = [NSError errorWithDomain:@"keyLengthError" code:-1 userInfo:nil];
        return nil;
    }

    CCCryptorStatus ccStatus   = kCCSuccess;
    int             ivLength   = kCCBlockSizeAES128;
    size_t          clearBytes = 0;
    NSMutableData *dataOut     = [NSMutableData dataWithLength:data.length - ivLength];

    ccStatus = CCCrypt(kCCDecrypt,
                       kCCAlgorithmAES,
                       kCCOptionPKCS7Padding,
                       key.bytes, key.length,
                       data.bytes,
                       data.bytes + ivLength, data.length - ivLength,
                       dataOut.mutableBytes, dataOut.length,
                       &clearBytes);

    if (ccStatus == kCCSuccess) {
        dataOut.length = clearBytes;
    }
    else {
        if (error) {
            *error = [NSError errorWithDomain:@"kEncryptionError" code:ccStatus userInfo:nil];
        }
        dataOut = nil;
    }

    return dataOut;
}

Test:

NSError *error;
NSData *key   = [@"Bad example key " dataUsingEncoding:NSUTF8StringEncoding];
NSData *clear = [@"Test Input"       dataUsingEncoding:NSUTF8StringEncoding];

NSData *encrypted = [Crypto aesCBCEncrypt:clear
                                         key:key
                                       error:&error];

NSData *decrypted = [Crypto aesCBCDecrypt:encrypted
                                         key:key
                                       error:&error];

NSLog(@"key:       %@", key);
NSLog(@"clear:     %@", clear);
NSLog(@"encrypted: %@", encrypted);
NSLog(@"decrypted: %@", decrypted);

Output:



key:       42616420 6578616d 706c6520 6b657920
clear:     54657374 20496e70 7574
encrypted: 44f02b5e 40bf5031 01cc55fd cad80a77 790b9d05 5a6c8de7 6c949191 d3ba57de
decrypted: 54657374 20496e70 7574
  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在目标 c 中生成初始化向量 的相关文章

  • 在 iOS 中发送音频文件和 JSON 字符串

    我正在尝试将音频文件和 JSON 字符串发送到 PHP 服务器 使用以下代码将发送 JSON 但文件到达时为空 如果我将 JSON 块放在音频块下方 文件将完全到达 但 JSON 为空 有什么想法吗 void sendFile NSStri
  • 在 Swift 中有条件导入基于 iOS 版本的框架(如 Speech)?

    有没有办法有条件地导入框架Swift基于运行时 iOS 版本 特别是 我有一个部署目标为的应用程序iOS 8 我想使用新的Apple Speech应用程序中的框架 如果在运行时可用 我知道 available iOS 10 代码部分的指令
  • iOS 9.3 中的 KVO 被破坏

    这可能是 iOS 9 3 发行版 中的一个可怕的错误 添加单个观察者时 NSUserDefaults standardUserDefaults 我注意到响应方法 observeValueForKeyPath ofObject change
  • 如何在 Alamofire 中使用“responseDecodable”方法?

    I have been trying to use responseDecodable method from Alamofire but I m getting Generic parameter T could not be infer
  • 如何使用 Objective-C 解析 JSON?

    我是 iPhone 新手 谁能告诉我解析此数据并获取活动详细信息 名字和姓氏的步骤 error false data activity id 35336 user id 1 user first name Chandra Bhusan us
  • 如何在 iOS 中创建多行表格单元格?

    如何让第二个单元格扩展以适合文本而不是缩放文本 iOS 中有内置的方法可以做到这一点 还是我必须想出一些自制的解决方案 如果您查看 iOS 联系人应用程序 会发现有一个类似地址的框 但我找不到如何实现这一点 对于任何希望将来实现这一目标的人
  • UICollectionViewFlowLayout 使其布局无效后重绘单元格

    当您使布局无效时UICollectionViewFlowLayout它为每个单元格创建了一堆新的布局属性 然而 它不会告诉您的单元格重新绘制 这会导致任何图层绘图变形 我不想告诉我的集合重新加载其数据 因为这会删除流属性之间的任何良好转换
  • Objective-C 属性和内存管理

    给出以下属性定义 property nonatomic retain MyObject foo 以下代码是否会导致内存泄漏 self foo MyObject alloc init 看起来 alloc 调用将对象上的保留计数增加到 1 然后
  • 使用 HTTP NSURL 创建 AVAsset

    我正在尝试合并两个NSURLs包含视频参考 其中一个 URL 指向 AWS 上的视频 另一个 URL 指向本地存储的视频 我的导出代码有效 因为我已经尝试使用两个本地视频 但每当我尝试合并 HTTP url 和本地 url 时 我都会收到此
  • ios GPUImage,小尺寸图像处理效果不好?

    我正在尝试为 OCR 准备图像 我使用 GPUImage 来完成 代码工作正常 直到我裁剪图像 裁剪后我得到了糟糕的结果 作物面积 https www dropbox com s e3mlp25sl6m55yk IMG 0709 PNG h
  • 如何将 RGB 值转换为十六进制字符串 iOS swift

    我想将 RGB 值转换为十六进制字符串 我将十六进制转换为 RGB 如下所示 但反之亦然 func hexStringToRGB hexString String gt red CGFloat green CGFloat blue CGFl
  • iOS UITableView:使用 CAGradientLayer 将背景颜色指定为渐变

    我刚刚开始使用 Xcode 4 3 中的主从视图模板 我试图更改主视图的背景颜色并将其设置为颜色渐变 这是我尝试过的 Colors m import Colors h implementation Colors UIColor naviga
  • 在 XCode 中本地化 HTML 文件

    我有一个本地化的 iOS 应用程序 我希望在其中包含一些本地化的 HTML 文件 我不知道该怎么做 目前 我的文件夹结构如下所示 myapp en lrproj Localizable strings fr lrproj Localizab
  • AST 文件格式错误或损坏

    我有一个问题 我不知道为什么会发生这种情况 但很可能是因为我错误地按了 移动到垃圾箱 到某些系统框架 我收到一条错误消息 AST 文件格式错误或损坏 找不到 AST 文件引用的文件 Users username myProject Quar
  • 块如何捕获其封闭范围之外的变量?

    我知道 Objective C 块可以捕获并设置其封闭范围之外的变量值 它是如何做到的 它实际上相当简单 并在 Clang 的块实现规范中进行了描述 在 导入变量 http clang llvm org docs Block ABI App
  • iOS 版 Google 地图 sdk 中折线的轮廓

    我的要求是在地图上显示一条绿色折线 但当地图切换到卫星视图时 绿色折线变得不清楚 我无法改变折线的颜色 因此 为了将折线与背景 地图的卫星视图 区分开来 我需要为折线绘制白色轮廓 我浏览了 GMSPolyline 类的文档 但找不到任何可以
  • 如何从 App Store Connect 中删除自动创建的 macOS 应用程序

    I have an iOS app Recently macOS app automatically appeared in App Store Connect 我不打算在 macOS 上发布 iOS 应用程序 我怎样才能摆脱它 我打开了
  • Xcode 中的 Prefix.pch 文件是什么?

    许多开发人员正在向其中添加各种方便的宏Prefix pch 但我的问题是那是什么Prefix pch file 如果我删除它Prefix pch来自我的文件Xcode 那么我的应用程序会运行吗 或者会显示什么错误吗 或者它会在构建过程中崩溃
  • 初始化Object中的空字符串?

    有人使用以下方法来初始化 NSstring NSString astring NSString alloc init 我想知道为什么不直接使用 NSString atring nil or NSString astring 没有semant
  • 生成签名和加密的 JWT

    我正在尝试使用生成签名和加密的 JWT 令牌雨云智威汤逊 http connect2id com products nimbus jose jwt private void generateToken throws JOSEExceptio

随机推荐

  • 使用 array_search 进行多维数组

    在一维数组中使用 array search 很简单 array array apple banana cherry searchValue cherry key array search searchValue array echo key
  • 如何在R编程中读取和解码二维码图像? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 如何在R编程中读取和解码二维码图像 我想将带有二维码的图像转换为文本 R 有用于生成 QR 码的库 如 package qrcode 和 packa
  • eclipse 中junit 的等宽字体?

    如何更改 JUnit 选项卡中的字体 以便它使用等宽字体显示结果 我正在使用 Groovy 我找到了解决方案here 您需要转到 Groovy gt Preferences 并选中使用等宽字体复选框
  • ag-grid v 22.1.1 升级后 ng build --prod 失败

    我已经开始使用ag grid从版本 18 开始 目前为 20 0 0 我正在升级到最新版本 22 1 1 解决由于重大更改而导致的警告 错误后 一切 包括 ng服务 都工作正常 但是 当我尝试在产品模式下构建角度应用程序时 它失败了 app
  • x86-64:规范地址和实际可用范围

    Intel 和 AMD 文档称 对于 64 位模式 实际上只有 48 位可用于虚拟地址 并且从 48 到 63 的位必须复制位 47 符号扩展 据我所知 当前所有的CPU都是以这种方式实现的 但是 理论上 没有什么禁止在未来的实现中扩展可用
  • 如何将jsPDF转换后的pdf文件发送到后端服务器?

    我需要将 png 文件发送到后端服务器 我使用 jsPDF 将其转换为 pdf var doc new jsPDF l mm 210 210 doc addImage myPngData PNG 0 0 210 210 现在我需要使用我的老
  • 如何阅读“fetch(PDO::FETCH_ASSOC);”

    我正在尝试使用 PHP 构建一个 Web 应用程序 并且我正在使用内存缓存用于存储数据库中的用户数据 例如 假设我有以下代码 sql SELECT FROM users WHERE user id user id stmt this gt
  • 从元模型强制执行单个实例

    我知道从类级别确保单个实例要容易得多 而且有很好的StaticishJonathan Stowe 的模块通过使用角色来执行相同的操作 但我只是想尝试更好地理解如何阶级高阶工作可以处理 主要是针对FOSDEM的讲 我可以想到在元模型级别上执行
  • 如何手动轮换 log4j 日志

    我将 log4j 配置为每天轮换日志 在特殊情况下 我想手动触发额外的日志轮换 这可能吗 如果可能的话 如何实现 像这样解决 void rolloverLogs for final Enumeration appenders logger
  • 使用 php-imagick api 将 PDF 转为图像

    我想将 PDF 转换为图像 但是当输出图像生成时 它会比原始图像变得模糊 这是代码 uploadfile pdf 53 img new Imagick uploadfile img gt setResolution 300 300 img
  • Tkinter 将带参数的函数绑定到小部件

    我有一个 tkinter 框架和一个附加到它的按钮 from tkinter import def rand func a b c effects print a b c root Tk frame Frame root frame bin
  • PHP:HTTP 基础 - 注销

    我想将其设置为如果有人发送 注销 请求 它会自动将他们带到一个显示 成功注销 的页面 如果客户尝试按后退按钮或进入受限区域 它将再次要求 HTTP 身份验证 到目前为止我所拥有的是这样的 example com restricted ind
  • Python 中 list.index(x) 的复杂性

    我指的是这个 http docs python org tutorial datastructs html 运行时间是多少list index x Big O 表示法的函数 时间复杂度为 O n 另请查看 http wiki python
  • 检查点是否位于由多个多边形/孔组成的空间对象中

    我有一个 SpatialPolygonsDataFrame 其中包含 11589 个 多边形 类对象 其中 10699 个对象恰好由 1 个多边形组成 但其余对象由多个多边形 2 到 22 组成 如果一个对象由多个多边形组成 则可能出现三种
  • Wix 安装程序包生成损坏的“msi”

    使用非常简单的代码 几乎与示例中相同
  • 在单元测试中使用反射是一种不好的做法吗? [复制]

    这个问题在这里已经有答案了 在过去的几年里 我一直认为在Java中 反射在单元测试中被广泛使用 由于一些必须检查的变量 方法是私有的 因此有必要读取它们的值 我一直以为Reflection API也是用于这个目的的 上周我必须测试一些包 因
  • Intel TSX 前缀是否在 AMD 上作为 NOP 执行(安全)?

    我有一个在 Intel 和 AMD x86 机器上运行的应用程序的 MASM 同步代码 我想使用 Intel TSX 前缀 特别是 XACQUIRE 和 XRELEASE 来增强它 如果我为 Intel 正确修改代码 当我尝试在 AMD 机
  • 检测其他进程正在使用的文件

    在 Windows 等上 我曾经使用一种技巧来找出当前正在使用的文件 专门编写的 我用来打开文件进行写入 如果失败 很可能另一个进程正忙于访问它 遗憾的是 这些技巧 使用带有独占锁的 C OPEN 进行写入 在我的 Mac 上不起作用 当我
  • 重叠的 UITableViewCell 内容视图

    I have this table whose cells look like this As you can see the top border of every cell is supposed to overlap with the
  • 在目标 c 中生成初始化向量

    java代码是 Cipher c Cipher getInstance AES CBC PKCS5Padding byte ivBytes new byte c getBlockSize String IV CryptoUtils hexE