1

Android と iOS で 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);

この暗号化の問題を解決するのを手伝ってくれる人はいますか?

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 に答える