2013-10-10 112 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”。请发布你的错误的堆栈跟踪。 –