- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我必须将一个 Android 应用迁移到使用 Cipher 的 iOS。所以这是 Android 代码:
PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new CBCBlockCipher(new DESedeEngine()));
...
byte[] result = Hex.encode(output, 0, output.length);
String resultS = new String(Str.toChars(result));
我为 objective-c 尝试了很多东西,但找不到一种方法来获得与我在 Java 上获得的字符串相同的字符串。我使用了这里的 iOS 代码 http://dotmac.rationalmind.net/2009/02/aes-interoperability-between-net-and-iphone/ (还有更多,但都做同样的事情)。
然后要在 iOS 上获取字符串,请使用如下内容:
NSString* resultS = [encryptedData base64Encoding]
但结果字符串不匹配。也许问题是我如何处理 NSData 的编码(似乎 Java 版本不使用 base64,我没问题?)
有什么想法吗?
编辑 1:
好的,我取得了一些进展(希望如此)。检查 java 代码,他们使用 block 大小为 8 的 block 和 DES/CBC, key 为 24 个字符。所以我将代码从 CocoaFu 更改为:
- (NSData *)doCipher:(NSData *)dataIn
key:(NSData *)symmetricKey
context:(CCOperation)encryptOrDecrypt
{
CCCryptorStatus ccStatus = kCCSuccess;
size_t cryptBytes = 0; // Number of bytes moved to buffer.
NSMutableData *dataOut = [NSMutableData dataWithLength:dataIn.length + kCCBlockSizeDES];
uint8_t iv[kChosenCipherBlockSize];
memset((void *) iv, 0x0, (size_t) sizeof(iv));
ccStatus = CCCrypt( encryptOrDecrypt,
kCCAlgorithmDES,
kCCOptionPKCS7Padding,
symmetricKey.bytes,
kCCKeySize3DES,
(const void *)iv,
dataIn.bytes,
dataIn.length,
dataOut.mutableBytes,
dataOut.length,
&cryptBytes);
if (ccStatus != kCCSuccess) {
NSLog(@"CCCrypt status: %d", ccStatus);
}
dataOut.length = cryptBytes;
return dataOut;
}
当我尝试在 Java 中对“测试”消息进行编码时,我得到“f69d7c299597c880”,但在 iOS 上(当然使用相同的 key )我得到“< 91864397 > < 41434eaa >”对于 3DES 和“< ed660859 > < 4bad6f7f > "对于 DES。关于我还可以改变什么的任何想法?
最佳答案
这是一个难题,因为它要么有效,要么无效,线索很少。最好的方法是从尽可能简单的开始并逐步建立。
首先要了解java代码到底在做什么。对于 CBC 模式,将有一个 iv(初始化值),但在发布的 Java 代码中没有明确指定。您需要找出 java 代码正在使用什么。同时发布完整的 Java 代码。
从代码 PaddedBufferedBlockCipher
我推断有 block 填充,这可能是 PKCS5 或 PKCS7,从填充的角度来看两者是相同的,iOS 等效项是 kCCOptionPKCS7Padding。确保这一点。
确保 key 长度相同,对于 AES,选项为 128、192 和 256 位,除非有特定原因使用 128。
代码 Hex.encode
似乎暗示输出是十六进制编码,你需要在 iOS 上做同样的事情,这与 Base64 不同。
另一个主要问题是让两侧的所有参数都相同。特别感兴趣的是:
尽可能简单地开始,所有 0 的 iv,一个 block 大小的数据,没有填充,简单的键,没有后处理。从一个可以在系统之间共享的文件中获取 key 、iv 和测试数据,这将防止一些错误,例如 c 字符串 jul 终止等。
这是我使用的 iOS 代码:
#import <CommonCrypto/CommonCryptor.h>
+ (NSData *)doCipher:(NSData *)dataIn
iv:(NSData *)iv
key:(NSData *)symmetricKey
context:(CCOperation)encryptOrDecrypt
{
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,
symmetricKey.bytes,
kCCKeySizeAES128,
iv.bytes,
dataIn.bytes,
dataIn.length,
dataOut.mutableBytes,
dataOut.length,
&cryptBytes);
if (ccStatus != kCCSuccess) {
NSLog(@"CCCrypt status: %d", ccStatus);
}
dataOut.length = cryptBytes;
return dataOut;
}
同时将 Security.framework 添加到您的项目中。
如果安全性很重要,请考虑让具有安全经验的人创建代码和协议(protocol)。如果安全性不重要,请以明文形式发送密码。
一个应用程序中的一些错误并没有那么糟糕,该应用程序仍然可以基本运行,一个安全性错误和所有安全性都丢失了。
良好的安全性并不像人们想象的那么容易——或者正如我妻子所说:“如果加密很容易,每个人都会这样做”,但她的意思是正确的。
关于Android -> iOS 密码迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7670540/
我最近开始从事一个 Sails 项目。它目前在迁移表下具有以下格式的迁移。 20160826122004-create_users_table.js 'use strict'; module.expo
当我尝试迁移时 doctrine:migrations:migrate ,我收到此异常:“元数据存储不是最新的,请运行 sync-metadata-storage 命令来解决此问题。”。这仅在尝试在生
我在 ec2 linux 7 上有一个 MarkLogic 服务器。我想将它迁移到 linux 6。我将 ebs 移动到新的 linux 6 并将其安装在 /var/opt/MarkLogic . 我
我对 OpenID 很好奇。虽然我同意统一凭证的想法很棒,但我有一些保留意见。什么是防止 OpenID 提供商发疯并持有他们拥有的 OpenID 帐户直到您支付 n 美元?如果我决定不喜欢这个提供商,
使用 SQL 很容易做到这一点,但我需要编写一个我不熟悉的 Knex 迁移脚本。以下代码在 order 表中行的末尾添加了 order_id 列。我想在 id 之后添加 order_id。我该怎么做?
使用 SQL 很容易做到这一点,但我需要编写一个我不熟悉的 Knex 迁移脚本。以下代码在 order 表中行的末尾添加了 order_id 列。我想在 id 之后添加 order_id。我该怎么做?
我想通过在 Yii2 中的迁移添加一个新列,使用以下代码: public function up() { $this->addColumn('news', 'priority', $this-
我正在尝试在 SQLDelight 的表中添加更多列。我做了一个迁移文件 1.sqm .在迁移文件中,它给出了找不到表的错误。 我的 build.gradle.kts: sqldelight {
我有一个与 Flyway DB 迁移相关的问题。通常如何管理处理相同 DB 模式的多个项目(微服务)。每个项目中的 Flyway 迁移脚本如果被其他项目修改,则不允许启动。他们是否有任何文档或最佳实践
我是 Laravel 的新手。我做了一份待办事项申请作为一项学校作业。我们必须使用迁移来创建我们的数据库。 我使用迁移创建了 2 个表。我的问题是:如果你第一次在你的电脑上运行这个项目,有没有办法自动
我正在尝试在 Laravel 中创建外键,但是当我使用 artisan 迁移表时,出现以下错误: [Illuminate\Database\QueryException] SQLSTATE[HY000
我从 Django 1.7 升级到 Django 1.9。我有多次迁移。升级后我无法再创建新的数据库。 问题是“django manage.py migrate”运行检查。检查导入应用程序 URL。这
我在创建数据迁移方面遇到了困难。我的应用程序使用两个数据库。我在 settings.py 中配置了数据库,并创建了一个像 Django docs 中一样的路由器. # settings.py DB_H
我有一个像这样的sql结构: CREATE TABLE resources ( id SERIAL PRIMARY KEY, title TEXT NOT NULL, created_at
我正在尝试使用模式构建器向表添加枚举选项(不丢失当前数据集)。 我真正能够找到的关于列更改的唯一信息是 http://www.flipflops.org/2013/05/25/modify-an-ex
我尝试转移到一些 CMake 程序中,并且有一个从 xml 生成头文件的函数。 生成文件.am adaptor_glue.hpp: dbus_introspect.xml $(DBUSXX_X
我想将文件移至我的 iOS 应用程序的 CoreData 存储 ../Library/Application Support/MyApp/ 至 ../Documents/Stores/ 我可以使用 N
有没有人对数据迁移进出 NetSuite 有丰富的经验?我必须将 DB2 表导出到 MySQL,处理数据,然后导出到一个 CSV 文件中。然后获取帐户的 CSV 文件并再次操作数据以使帐户从我们的旧系
我正在尝试在 Django 上建立一个博客。我已经走到了创建模型的地步。他们在这里: from django.db import models import uuid class Users(mode
我最近使用 bluehost 上的 AutoSSL 工具将网站迁移到 HTTPS。我在内容中看到一些失真,例如缺少背景颜色、表格位移、缺少_logos 等。 有谁知道 HTTPS 迁移效果如何影响样式
我是一名优秀的程序员,十分优秀!