Android 安卓->;iOS密码迁移
我必须将Android应用程序迁移到使用密码的iOS。下面是Android代码:Android 安卓->;iOS密码迁移,android,iphone,objective-c,ios,encryption,Android,Iphone,Objective C,Ios,Encryption,我必须将Android应用程序迁移到使用密码的iOS。下面是Android代码: PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new CBCBlockCipher(new DESedeEngine())); ... byte[] result = Hex.encode(output, 0, output.length); String resultS = new String(Str.toChars(resul
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代码(还有很多,但都是一样的)
然后,要在iOS上获取字符串,请使用以下命令:
NSString* resultS = [encryptedData base64Encoding]
但是结果字符串不匹配。可能问题在于如何处理NSData的编码(Java版本似乎不使用base64,我可以吗?)
有什么想法吗
编辑1:
好的,我取得了一些进步(我希望如此)。检查java代码时,他们使用块大小为8的DES/CBC,键为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;
}
- (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编码“test”消息时,我得到了“f69d7c299597c880”,但在iOS上(当然使用相同的键),我得到了3DES的“<91864397><41434eaa>”,DES的“
PaddedBufferedBlockCipher
中,我推断存在块填充,这可能是PKCS5或PKCS7,从填充角度来看,两者都是相同的,iOS等效物是KCCOPIONPKCS7Padding。确保这一点
确保密钥长度相同,对于AES,选项为128、192和256位,除非有特定原因使用128
代码Hex.encode
似乎暗示输出是十六进制编码的,您需要在iOS上执行相同的操作,这与Base64不同
另一个主要问题是让双方的所有参数都相同。特别令人感兴趣的是:
#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;
}
#导入
+(NSData*)doCipher:(NSData*)数据输入
四:(NSData*)四
键:(NSData*)symmetricKey
上下文:(cOperation)encryptOrDecrypt
{
CCCryptorStatus ccStatus=KCCSucces;
size\u t cryptBytes=0;//移动到缓冲区的字节数。
NSMutableData*dataOut=[NSMutableData dataWithLength:dataIn.length+kCCBlockSizeAES128];
ccStatus=CCCrypt(encryptOrDecrypt,
KCcalGorithmae128,
KCCOPIONPKCS7填充,
symmetricKey.bytes,
kCCKeySizeAES128,
iv.字节,
以字节为单位的数据,
dataIn.length,
dataOut.mutableBytes,
dataOut.length,
&密码字节);
if(ccStatus!=KCCSucces){
NSLog(@“CCCrypt状态:%d”,ccStatus);
}
dataOut.length=cryptBytes;
返回数据输出;
}
还要将Security.framework添加到项目中
如果安全性很重要,请考虑有安全经验的人创建代码和协议。如果安全性不重要,只需在clear中发送密码即可
一个应用程序中的一些bug并没有那么糟糕,应用程序基本上仍然可以工作,一个安全性bug和所有安全性都丢失了 良好的安全性并不像人们想象的那么容易——或者像我妻子说的那样:“如果加密很容易,每个人都会这么做”,但她的意思是正确的。好吧,我取得了一些进展(我希望如此)。检查java代码时,他们使用块大小为8的DES/CBC,键为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;
}
- (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编码“test”消息时,我得到了“f69d7c299597c880”,但在iOS上(当然使用相同的键),我得到了3DES的“<91864397><41434eaa>”,DES的“