2013-10-10 98 views
1

我試圖使用RC2算法在Android和iOS中使用PKCS7填充來加密數據,但結果不同。iOS和Android中的RC2和PKCS7加密

我需要得到確切的結果。 KEY和IV已經提供,但我不知道如何處理它們。我需要獲得與ios中的代碼相同的結果。

IV = "11223344" 
KEY = "Sample" 

IOS代碼:

NSString *iv = IV ; 

NSData *data = [s dataUsingEncoding:NSASCIIStringEncoding]; 
//key 
NSString *key = KEY; 

const char *keyPtr = [key cStringUsingEncoding:NSASCIIStringEncoding]; 
const char *cIv = [iv cStringUsingEncoding:NSASCIIStringEncoding]; 

NSUInteger dataLength = [data length]; 

size_t bufferSize = dataLength + kCCBlockSizeRC2; 
void *buffer = malloc(bufferSize); 
//kCCBlockSizeAES128 
size_t numBytesEncrypted = 0; 
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, 
             kCCAlgorithmRC2, 
             kCCOptionPKCS7Padding,keyPtr, 
             [key length], 
             cIv, 
             [data bytes], 
             dataLength, 
             buffer, 
             bufferSize, 
             &numBytesEncrypted); 

的Android代碼:

SecretKeySpec skeySpec = new SecretKeySpec(Constant.RC2_KEY.getBytes("US-ASCII"), "PBEWITHSHAAND128BITRC2-CBC"); 
IvParameterSpec iv = new IvParameterSpec(Constant.RC2_IV.getBytes("US-ASCII")); 
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); 
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv); 
byte[] encrypted = cipher.doFinal(data); 
return encrypted; 

有了這個代碼,該cipher.init()不執行,並將其結果一個錯誤。但是當我將「AES/CBC/PKCS7Padding」「AES/CBC/PKCS5Padding」改爲「PBEWITHSHAAND128BITRC2-CBC」它沒有。它對數據進行加密,但與ios代碼的結果不同。

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); 
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv); 

任何人都可以請幫我解決這個加密thingy?

+0

可能有助於提供示例輸入數據和預期輸出。 –

回答

0

您的Java代碼看起來非常糟糕 - 您當然不希望引用AES作爲您的算法。

以下代碼將正確使用RC2。我沒有能力測試你的iOS代碼,所以也許還有其他問題。

byte[] iv = "87654321".getBytes("US-ASCII"); 
byte[] key = "SampleKey".getBytes("US-ASCII"); 
byte[] data = new byte[30]; // for example 

SecretKeySpec skeySpec = new SecretKeySpec(key, "RC2"); 

RC2ParameterSpec ivSpec = new RC2ParameterSpec(key.length * 8, iv); 

Cipher cipher = Cipher.getInstance("RC2/CBC/PKCS5Padding"); 
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivSpec); 
byte[] encrypted = cipher.doFinal(data); 

// .... 

注使用RC2ParameterSpec,這是由算法所需,再加上參考PKCS5Padding而非PKCS7Padding

+0

我可以知道key.length * 8是什麼意思? – sarenagay

+0

我試着運行代碼,但在Cipher.getInstance()期間出錯。 – sarenagay

+0

@sarenagay閱讀['RC2ParameterSpec']的Javadocs(http://docs.oracle.com/javase/7/docs/api/javax/crypto/spec/RC2ParameterSpec.html#RC2ParameterSpec%28int,%20byte []% 29)。它解釋說你需要按位提供密鑰大小,因此「key.length * 8」。請發佈你的錯誤的堆棧跟蹤。 –