【发布时间】:2012-09-26 18:15:54
【问题描述】:
我真的真的……真的需要帮助…………
-已更新-
我需要帮助,因为与 iOS 3DES 函数相比,我的 java 函数给出了不同的结果。我发布了来自 ios 和 java 的代码;当指定明文为“tutor.1”且 MD5 密钥为“spO13+QLZCRAe93pIXMXLg==”(显然,MD5 对两者相同)时的结果。
JAVA 3DES(简短)
public static String encrypt(String plaintext, String enctoken){
if(enctoken == null)
enctoken = "sfdjf48mdfdf3054";
String encrypted = null;
byte[] plaintextByte = EncodingUtils.getBytes(plaintext,"UTF-8");
byte[] hash = Connessione.md5(enctoken);
Log.i("ENCRYPT", "MD5: "+Base64.encodeToString(hash, 0));
try {
Cipher cipher = Cipher.getInstance("DESEDE/ECB/PKCS5Padding");
SecretKeySpec myKey = new SecretKeySpec(hash,"DESede");
cipher.init(Cipher.ENCRYPT_MODE, myKey);
try {
byte[] encryptedPlainText = cipher.doFinal(plaintextByte);
encrypted = Base64.encodeToString(encryptedPlainText, 0);
Log.i("ENCRYPT", "Pwd encrypted: "+encrypted);
return encrypted;
} catch (IllegalBlockSizeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (BadPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidKeyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "";
}
结果:R4mXAaHcFxM=
IOS 3DES - 再次更新
// key value in parameters is MD5 value! It is the same for both version
+ (NSString *) encrypt:(NSString *) dataToEncrypt withKey:(NSString*) key{
NSData *data = [dataToEncrypt dataUsingEncoding:NSUTF8StringEncoding];
NSData *mData = [key dataUsingEncoding:NSUTF8StringEncoding];
CCCryptorStatus ccStatus = kCCSuccess;
// Begin to calculate bytesNeeded....
size_t bytesNeeded = 0;
ccStatus = CCCrypt(kCCEncrypt,
kCCAlgorithm3DES,
kCCOptionECBMode | kCCOptionPKCS7Padding,
[mData bytes],
[mData length],
nil,
[data bytes],
[data length],
NULL,
0,
&bytesNeeded);
if(kCCBufferTooSmall != ccStatus){
NSLog(@"Here it must return BUFFER TOO SMALL !!");
return nil;
}
// .....End
// Now i do the real Crypting
char* cypherBytes = malloc(bytesNeeded);
size_t bufferLength = bytesNeeded;
if(NULL == cypherBytes)
NSLog(@"cypherBytes NULL");
ccStatus = CCCrypt(kCCEncrypt,
kCCAlgorithm3DES,
kCCOptionECBMode | kCCOptionPKCS7Padding,
[mData bytes],
[mData length],
nil,
[data bytes],
[data length],
cypherBytes,
bufferLength,
&bytesNeeded);
if(kCCSuccess != ccStatus){
NSLog(@"kCCSuccess NO!");
return nil;
}
return [Base64 encode:[NSData dataWithBytes:cypherBytes length:bufferLength]];
}
结果:YBAva5J2khY=
我需要 iOS 版本返回与 Java 版本相同的结果。
我在这里找到了 Base64 类:http://www.imthi.com/blog/programming/iphone-sdk-base64-encode-decode.php
我做错了什么?
感谢您的帮助和时间
【问题讨论】:
-
你有ECB模式下的java算法。你能检查一下IOS是否也有吗?
-
任何方式 3DES 都不是那么安全。您可以选择 AES
-
所以一次你在密钥上使用MD5,第二次你不用,第一次你加密一个7个字符的字符串得到5个完整的块,第二次一个块?你看过节目吗?
-
@AmidD 对于前 8 个字节无关紧要,因为 IV 设置为全零。问题是如何加密 7 个字节的纯文本并获得 5 个完整的块作为回报。我不认为你可以,所以纯文本必须不同。
-
IOS 3DES 代码不是我的。我正在尝试根据我的目的调整该代码,但我不太了解所有步骤,所以我寻求帮助是正常的。你的专家眼可以看到我的新手眼看不到的东西。就这样。如果您能告诉我哪些代码行错误以及如何修复它,我非常感谢。我也尝试添加 kCCOptionECBMode,但显然我必须在此之前修复其他问题
标签: java ios algorithm encryption 3des