iphone中的3des加密
我对iOS开发和目标c相当陌生。 我正在开发一个将加密数据发送到服务器的应用程序。 服务器使用带cbc且无填充的3DE。 我已经阅读了stackoverflow中的大部分相关问题,但仍然无法让它工作。 这方面的工作已经进行了几天,但仍然无法使其与服务器加密匹配 以下是我的工作:iphone中的3des加密,iphone,ios,encryption,3des,Iphone,Ios,Encryption,3des,我对iOS开发和目标c相当陌生。 我正在开发一个将加密数据发送到服务器的应用程序。 服务器使用带cbc且无填充的3DE。 我已经阅读了stackoverflow中的大部分相关问题,但仍然无法让它工作。 这方面的工作已经进行了几天,但仍然无法使其与服务器加密匹配 以下是我的工作: NSString* plaintexthex = @"536176696E67204163636F756E747C313233343536000000"; NSData *dTextIn = [self dataFrom
NSString* plaintexthex = @"536176696E67204163636F756E747C313233343536000000";
NSData *dTextIn = [self dataFromHexString:plaintexthex]; //my own way of convert hex to data
NSString* keyhex = @"6E7B336FD2051BA165A9362BD9735531";
NSData *_keyData = [self dataFromHexString:keyhex]; //my own way of convert hex to data
CCCryptorStatus ccStatus;
uint8_t *bufferPtr = NULL;
size_t bufferPtrSize = 0;
size_t movedBytes = 0;
bufferPtrSize = ([dTextIn length] + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);
bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));
memset((void *)bufferPtr, 0x00, bufferPtrSize);
uint8_t iv[kCCBlockSize3DES];
memset((void *) iv, 0x00, (size_t) sizeof(iv));
unsigned char *bytePtr = (unsigned char *)[_keyData bytes];
ccStatus = CCCrypt(kCCEncrypt, // CCoperation op
kCCAlgorithm3DES, // CCAlgorithm alg
kCCModeCBC, // CCOptions
[_keyData bytes], // const void *key
kCCKeySize3DES, // 3DES key size length 24 bit
iv, // const void *iv,
[dTextIn bytes], // const void *dataIn
[dTextIn length], // size_t dataInLength
bufferPtr, // void *dataOut
bufferPtrSize, // size_t dataOutAvailable
&movedBytes); // size_t *dataOutMoved
NSString *result;
NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length: (NSUInteger)movedBytes];
result = [self hexStringFromData:myData];
NSLog(@"Data to encrypt %@",dTextIn);
NSLog(@"Encryption key %@",_keyData);
NSLog(@"Bytes of key are %s ", bytePtr);
NSLog(@"Key length %d ",[_keyData length]);
NSLog(@"Encrypted bytes %@", myData);
NSLog(@"Encrypted string %@", result);
NSLog(@"Encrypted string length %d", [result length]);
- (NSData *)dataFromHexString:(NSString *)string
{
NSMutableData *stringData = [[[NSMutableData alloc] init] autorelease];
unsigned char whole_byte;
char byte_chars[3] = {'\0','\0','\0'};
int i;
for (i=0; i < [string length] / 2; i++) {
byte_chars[0] = [string characterAtIndex:i*2];
byte_chars[1] = [string characterAtIndex:i*2+1];
whole_byte = strtol(byte_chars, NULL, 16);
[stringData appendBytes:&whole_byte length:1];
}
return stringData;
}
基本上,我想复制这种类似的加密,以便在iOS平台上使用。
欢迎提供任何帮助,并提前向您表示感谢。
kCCModeCBC
是一种模式,而不是选项。您需要的选项是0
。CBC是CCCrypt()
的默认模式。默认设置也没有填充。我是iOS用户,不是开发人员,但据我所知,iOS不再支持3DES。我使用iPad进行VPN,iOS 3与3DES加密配合得很好,但从iOS 4开始,所需的最低加密级别是AES128
希望能有所帮助。@owlstead感谢您的回复。缓冲区大小的计算应该正确。我搜索了很多其他的帖子,所有的帖子都是用同样的方式。至于十六进制转换,我在日志中显示了转换后的值,它似乎与原始十六进制字符串匹配。如果可能的话,你能指出我的错误吗?谢谢。很抱歉,无法在Linux上编译通用加密库,因此我无法调试。我面临类似的问题。你解决了吗?谢谢你的回复。kccModeCBC和0为我提供了相同的结果。
public byte[] encrypt(byte[] key, byte[] message) throws Exception {
byte [] plainTextBytes = message;
byte[] encryptKey = key;
SecretKey theKey = new SecretKeySpec(encryptKey, "DESede");
Cipher cipher = Cipher.getInstance("DESede/CBC/NoPadding");
IvParameterSpec IvParameters = new IvParameterSpec(new byte[] {(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00});
cipher.init(Cipher.ENCRYPT_MODE, theKey, IvParameters);
byte[] encrypted = cipher.doFinal(plainTextBytes);
return encrypted;
}