1

我正在尝试在 Android 和 iOS 中使用带有 PKCS7 填充的 RC2 算法来加密数据,但结果不同。

我需要得到确切的结果。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);

安卓代码:

 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);

谁能帮我解决这个加密问题?

4

1 回答 1

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

于 2013-10-10T12:40:54.850 回答