- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试在 iOS 上实现一种加密方式。以匹配在 JAVA 上运行的那个。
但我尝试的每件事都会导致不同的加密模式
这是我用于加密的 Java 代码:
public static String encrypt(String plaintext)
throws Exception
{
Cipher c = Cipher.getInstance("DESede/CBC/PKCS5Padding");
c.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(sharedkey, "DESede"), new IvParameterSpec(sharedvector));
byte[] encrypted = c.doFinal(plaintext.getBytes("UTF-8"));
return Base64.encode(encrypted);
}
有什么简单的方法可以在 objective-c 中使用 DESede/CBC/PKCS5Padding 吗?
这是我正在使用的代码,但它给出了不同的结果
+ (NSString*) doCipher:(NSString*)plainText:(CCOperation)encryptOrDecrypt {
const void *vplainText;
size_t plainTextBufferSize;
if (encryptOrDecrypt == kCCDecrypt)
{
// NSData *EncryptData = [NSData dataWithBase64EncodedString:plainText];
// plainTextBufferSize = [EncryptData length];
// vplainText = [EncryptData bytes];
}
else
{
NSData *tempData = [plainText dataUsingEncoding:NSASCIIStringEncoding];
plainTextBufferSize = [tempData length];
vplainText = [tempData bytes];
}
CCCryptorStatus ccStatus;
uint8_t *bufferPtr = NULL;
size_t bufferPtrSize = 0;
size_t movedBytes = 0;
// uint8_t ivkCCBlockSize3DES;
bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);
bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));
memset((void *)bufferPtr, 0x0, bufferPtrSize);
//my shared key i changed to Zeros
NSMutableData *payload = [[NSMutableData alloc] init];
[payload appendBytes:"00" length:1];
[payload appendBytes:"00" length:1];
[payload appendBytes:"00" length:1];
[payload appendBytes:"00" length:1];
[payload appendBytes:"00" length:1];
[payload appendBytes:"00" length:1];
[payload appendBytes:"00" length:1];
[payload appendBytes:"00" length:1];
[payload appendBytes:"00" length:1];
[payload appendBytes:"00" length:1];
[payload appendBytes:"00" length:1];
[payload appendBytes:"00" length:1];
[payload appendBytes:"00" length:1];
[payload appendBytes:"00" length:1];
[payload appendBytes:"00" length:1];
[payload appendBytes:"00" length:1];
[payload appendBytes:"00" length:1];
[payload appendBytes:"00" length:1];
[payload appendBytes:"00" length:1];
[payload appendBytes:"00" length:1];
[payload appendBytes:"00" length:1];
[payload appendBytes:"00" length:1];
[payload appendBytes:"00" length:1];
[payload appendBytes:"00" length:1];
NSString *key = [[NSString alloc]initWithData:payload encoding:NSUTF8StringEncoding];
//my iV i changed it to zeros
NSMutableData *IV = [[NSMutableData alloc] init];
[IV appendBytes:"00" length:1];
[IV appendBytes:"00" length:1];
[IV appendBytes:"00" length:1];
[IV appendBytes:"00" length:1];
[IV appendBytes:"00" length:1];
[IV appendBytes:"00" length:1];
[IV appendBytes:"00" length:1];
[IV appendBytes:"00" length:1];
NSLog(@"key byte is %s", [payload bytes]);
NSLog(@"IV byte is %s", [IV bytes]);
// Initialization vector; dummy in this case 0's.
uint8_t iv[kCCBlockSize3DES];
memset((void *) iv, 0x0, (size_t) sizeof(iv));
ccStatus = CCCrypt(encryptOrDecrypt,
kCCAlgorithm3DES,
kCCOptionPKCS7Padding,
(const void *)[payload bytes], //"123456789012345678901234", //key
kCCKeySize3DES,
[IV bytes], //iv,
vplainText, //plainText,
plainTextBufferSize,
(void *)bufferPtr,
bufferPtrSize,
&movedBytes);
//if (ccStatus == kCCSuccess) NSLog(@"SUCCESS");
/*else*/ if (ccStatus == kCCParamError) return @"PARAM ERROR";
else if (ccStatus == kCCBufferTooSmall) return @"BUFFER TOO SMALL";
else if (ccStatus == kCCMemoryFailure) return @"MEMORY FAILURE";
else if (ccStatus == kCCAlignmentError) return @"ALIGNMENT";
else if (ccStatus == kCCDecodeError) return @"DECODE ERROR";
else if (ccStatus == kCCUnimplemented) return @"UNIMPLEMENTED";
NSString *result;
if (encryptOrDecrypt == kCCDecrypt)
{
// result = [[NSString alloc] initWithData: [NSData dataWithBytes:(const void *)bufferPtr length:[(NSUInteger)movedBytes] encoding:NSASCIIStringEncoding]];
result = [[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes] encoding:NSASCIIStringEncoding];
}
else
{
NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
NSLog(@"data is: %@", myData);
result = [myData base64EncodedString];
// result = [[NSString alloc]initWithData:myData encoding:NSUTF8StringEncoding];
}
return result;
}
最佳答案
@owlstead 谢谢你的提示,
我真的检查了每件事,你是对的,问题出在输入上
所以这是正确的输入方式:
unsigned char result1[24]= {0,0,0,0,0,0,0,0,0,0,0,00,0,0,0,0,0,0,0,00,00,00,00,0};
unsigned char IV3[8]={0,0,0,0,0,0,0,0};
当然,您必须将数字更改为您自己的 key 和 IV。
完整代码:只需将 IV 和结果更改为您的数据 :)
- (NSString*) doCipher:(NSString*)plainText enc:(CCOperation)encryptOrDecrypt{
const void *vplainText;
size_t plainTextBufferSize;
if (encryptOrDecrypt == kCCDecrypt)
{
NSData *EncryptData =[NSData dataWithBase64EncodedString:plainText];
plainTextBufferSize = [EncryptData length];
vplainText = [EncryptData bytes];
}
else
{
plainTextBufferSize = [plainText length];
vplainText = (const void *) [plainText UTF8String];
}
CCCryptorStatus ccStatus;
uint8_t *bufferPtr = NULL;
size_t bufferPtrSize = 0;
size_t movedBytes = 0;
// uint8_t ivkCCBlockSize3DES;
bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);
bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));
memset((void *)bufferPtr, 0x0, bufferPtrSize);
unsigned char result1[24]= {0,0,0,0,0,0,0,0,0,0,0,00,0,0,0,0,0,0,0,00,00,00,00,0};
unsigned char IV3[8]={0,0,0,0,0,0,0,0};
uint8_t iv[kCCBlockSize3DES];
memset((void *) iv, 0x0, (size_t) sizeof(iv));
ccStatus = CCCrypt(encryptOrDecrypt,
kCCAlgorithm3DES,
kCCOptionPKCS7Padding ,
result1, //"123456789012345678901234", //key
kCCKeySize3DES,
IV3 , //iv,
vplainText, //plainText,
plainTextBufferSize,
(void *)bufferPtr,
bufferPtrSize,
&movedBytes);
//if (ccStatus == kCCSuccess) NSLog(@"SUCCESS");
/*else*/ if (ccStatus == kCCParamError) return @"PARAM ERROR";
else if (ccStatus == kCCBufferTooSmall) return @"BUFFER TOO SMALL";
else if (ccStatus == kCCMemoryFailure) return @"MEMORY FAILURE";
else if (ccStatus == kCCAlignmentError) return @"ALIGNMENT";
else if (ccStatus == kCCDecodeError) return @"DECODE ERROR";
else if (ccStatus == kCCUnimplemented) return @"UNIMPLEMENTED";
NSString *result;
if (encryptOrDecrypt == kCCDecrypt)
{
result = [ [NSString alloc] initWithData: [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes] encoding:NSASCIIStringEncoding];
}
else
{
NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
NSLog(@"data is: %@", myData);
result = [NSData base64StringFromData:myData length:myData.length];
// result = [[NSString alloc]initWithData:myData encoding:NSUTF8StringEncoding];
}
return result;
}
关于ios - Objective-C DESede/CBC/PKCS5Padding,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16833530/
我正在开发一个项目,该项目使用 Java 服务来加密我从网络服务收到的签名。我需要用 JavaScript 替换这段代码。 这是我使用 JavaScript 的地方 http://jsfiddle.n
我在 Java 中使用 DESede 加密,我想在 C++ 中使用 OpenSSL 的 API 进行相同的加密。 Java代码: String secretKey = "abcdefghijk
我们有一个与java相关的应用程序,它以加密形式将密码存储在数据库中,因此我们需要解密并使用它进行身份验证,并再次加密密码并存储在数据库中以创建新用户。基本上我们使用加密/密码验证的解密标准。它最初是
我正在尝试在 iOS 上实现一种加密方式。以匹配在 JAVA 上运行的那个。 但我尝试的每件事都会导致不同的加密模式 这是我用于加密的 Java 代码: public static String
我在理解java和python的三重Des算法之间的概念时遇到问题。在 java 中,加密 key 的长度为 48 个字符,而在 python 中则不能应用相同的 key 。我尝试了提到的两个建议 h
我必须匹配的输出来自 Java DESede,使用 2005 年的 BouncyCaSTLe Jar ...我非常接近... 这是我在 Java 中的输出(这是正确的),后面是我在 C# 中的输出..
我尝试兼容 C# 和 Java 的加密/解密。 据我所知,默认模式在 Java 中是“ecb/pkcs5”,在 C# 中是“cbc/pkcs7”。 所以我匹配这些东西。 第一个问题是 PKCS7 和
我写了这段代码,我的 key 是:“ooWqEPcw7KR/h/JIbrFCRHiEVaybvnB2”。 try { Base64Decoder base64Decod
我正尝试在 Java 中使用 TripleDES 加密。来自Wikipedia article在 Keying Options 下,我想使用选项 1,其中 所有三个键都是独立的。 来自Cipher d
我正在尝试将 Java 的 DESede 解密转换为 PHP 的版本。然而,对于相同的输入,PHP 无法提供相同的输出。 Java: public class ThreeDES { priva
代码使用 DiffieHellman 和 DES 加密。DES 不安全,我想使用 DESede 或 AES。 SecretKeyFactory skf = SecretKeyFactory.getIn
首先我要说声谢谢... 我写了一个程序,用枚举来加密和解密。枚举有 AES、BlowFish、DESede。我的程序将支持这 3 种加密算法。 然后我想用SecretKeyFactory生成一个Sec
加密文本是用JAVA完成的(我们根本没有JAVA背景) 解密将用 C# 进行,代码如下 public static string DecryptString(string Message, strin
在我的 Android 应用程序中,我想使用 DESede/CBC/PKCS5Padding 加密密码,我的解决方案适用于 Lollipop(5.x)、Android KitKat(4.4.x) 和
我知道这个问题经常被问到,但我已经检查了我在 Stack Overflow 中找到的所有内容,但没有找到解决我的问题的方法。 我正在使用 DESede 进行加密和解密,并采用外部 24 字节 key
我想创建一个大小为 128 位的 TDES key ,因此我使用 keytool 通过以下命令生成 jceks。当我在 C:\Program Files (x86)\Java\jdk1.8.0_25\
我是一名优秀的程序员,十分优秀!