gpt4 book ai didi

Android -> iOS 密码迁移

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:25:27 28 4
gpt4 key购买 nike

我必须将一个 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 不同。

另一个主要问题是让两侧的所有参数都相同。特别感兴趣的是:

  1. 加密 key 值和大小
  2. 模式:CBC、ECB 等(您可能应该使用 CBC)
  3. 大多数模式都需要初始化向量 (iv)
  4. 填充方式:PKCS7等(AES是 block 密码,需要输入 block 大小的倍数)
  5. 任何后加密处理,十六进制或 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com