DES加密結果iOS端和Java端保持一致問題小結

小結:其實網上大部分帖子已經給出相應的代碼,但你會發現加密的結果不一致。有個關鍵點。

const char *textBytes = [plainText UTF8String];

字符串直接轉字節數組就會和java加密結果不一樣。

NSData *textData = [plainText dataUsingEncoding:NSUTF8StringEncoding];

用NSString 轉 NSData 取字節流 和java加密結果一致。

具體代碼如下

Java 部分代碼?

需要自己引入sun.misc.BASE64Decoder.jar

/**

* Description 根據鍵值進行加密

*

* @param data

* @param key? 加密鍵byte數組

* @return

* @throws HiIPSException

* @throws Exception

*/

private static byte[] encrypt(byte[] data, byte[] key) throws Exception {

// 生成一個可信任的隨機數源

SecureRandom sr = new SecureRandom();

Cipher cipher;

try {

// 從原始密鑰數據創建DESKeySpec對象

DESKeySpec dks = new DESKeySpec(key);

// 創建一個密鑰工廠,然后用它把DESKeySpec轉換成SecretKey對象

SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);

SecretKey securekey = keyFactory.generateSecret(dks);

// Cipher對象實際完成加密操作

cipher = Cipher.getInstance(DES);

// 用密鑰初始化Cipher對象

cipher.init(Cipher.ENCRYPT_MODE, securekey, sr);

return cipher.doFinal(data);

} catch (Exception e) {

throw new Exception("DES加密異常" + e.toString());

}

}

執行Main方法

public static void main(String[] args) throws Exception {

String data = "加密參數值";

String key = "商戶秘鑰";

//簽約參數加密輸出

System.out.println(encrypt(data, key, "UTF-8"));

}

iOS端?

#pragma mark- 加密算法

- (NSString *)encryptUseDES:(NSString *)plainText key:(NSString *)key

{

NSString *ciphertext = nil;

//const char *textBytes = [plainText UTF8String];字符串直接轉字節數組就會和java加密結果不一樣, 用NSString 轉 NSData 取字節流 和java加密結果一致

NSData *textData = [plainText dataUsingEncoding:NSUTF8StringEncoding];

NSUInteger dataLength = [textData length];

unsigned char buffer[1024];

memset(buffer, 0, sizeof(char));

Byte iv[] = {1,2,3,4,5,6,7,8};

size_t numBytesEncrypted = 0;

CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmDES,

kCCOptionPKCS7Padding|kCCOptionECBMode,

[key UTF8String], kCCKeySizeDES,

iv,

[textData bytes], dataLength,

buffer, 1024,

&numBytesEncrypted);

if (cryptStatus == kCCSuccess) {

NSData *data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesEncrypted];

ciphertext =? [[NSString alloc] initWithData:[GTMBase64 encodeData:data] encoding:NSUTF8StringEncoding];

}

return ciphertext;

}

#pragma mark- 解密算法

- (NSString *)decryptUseDES:(NSString *)cipherText key:(NSString *)key

{

NSString *plaintext = nil;

NSData *cipherdata = [GTMBase64 decodeString:cipherText];

unsigned char buffer[1024];

memset(buffer, 0, sizeof(char));

Byte iv[] = {1,2,3,4,5,6,7,8};

size_t numBytesDecrypted = 0;

// kCCOptionPKCS7Padding|kCCOptionECBMode 最主要在這步

CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmDES,

kCCOptionPKCS7Padding|kCCOptionECBMode,

[key UTF8String], kCCKeySizeDES,

iv,

[cipherdata bytes], [cipherdata length],

buffer, 1024,

&numBytesDecrypted);

if(cryptStatus == kCCSuccess) {

NSData *plaindata = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesDecrypted];

plaintext = [[NSString alloc]initWithData:plaindata encoding:NSUTF8StringEncoding];

}

return plaintext;

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容