iOSencryptionAES128 / CBC / nopadding为什么不能正常工作?

我有一个应用程序,需要使用AES / CBC /无填充编码一些数据。 该应用程序也在Android上移植。 那里的编码是这样做的:

byte[] encodedKey = getKey(); SecretKeySpec skeySpec = new SecretKeySpec(encodedKey, "AES"); AlgorithmParameterSpec paramSpec = new IvParameterSpec(initializationVector); Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); cipher.init(Cipher.ENCRYPT_MODE, skeySpec, paramSpec); int blockSize = cipher.getBlockSize(); int diffSize = decrypted.length % blockSize; System.out.println("Cipher size: " + blockSize); System.out.println("Current size: " + decrypted.length); if (diffSize != 0) { diffSize = blockSize - diffSize; byte[] oldDecrypted = decrypted; decrypted = new byte[decrypted.length + diffSize]; System.arraycopy(oldDecrypted, 0, decrypted, 0, oldDecrypted.length); for (int i = 0; i < diffSize; i++) { decrypted[i + oldDecrypted.length] = " ".getBytes()[0]; } System.out.println("New size: " + decrypted.length); } return cipher.doFinal(decrypted); 

initializationVector看起来像这样:

 private byte[] initializationVector = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; 

在iOS上我有这样的encryption:

 - (NSData *)AES128EncryptWithKey:(NSString *)key { // 'key' should be 16 bytes for AES128, will be null-padded otherwise char keyPtr[kCCKeySizeAES128+1]; // room for terminator (unused) bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding) // fetch key data [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; NSUInteger dataLength = [self length]; //See the doc: For block ciphers, the output size will always be less than or //equal to the input size plus the size of one block. //That's why we need to add the size of one block here size_t bufferSize = dataLength + kCCBlockSizeAES128; void *buffer = malloc(bufferSize); size_t numBytesEncrypted = 0; CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, 0x0000, keyPtr, kCCKeySizeAES128, NULL /* initialization vector (optional) */, [self bytes], dataLength, /* input */ buffer, bufferSize, /* output */ &numBytesEncrypted); if (cryptStatus == kCCSuccess) { //the returned NSData takes ownership of the buffer and will free it on deallocation return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted]; } free(buffer); //free the buffer; return nil; } 

上述方法是NSData类别的一部分。 该方法如下所示:

 NSData *data = [@"4915200456727" dataUsingEncoding:NSUTF8StringEncoding]; NSData *cipher = [data AES128EncryptWithKey:@"@x#zddXekZerBBw6"]; NSString *ecriptedString = [NSString stringWithFormat:@"%.*s", [cipher length], [cipher bytes]]; 

我有的问题是,我没有收到iOS和Android上相同的encryption数据。 在iOS上,encryption数据的长度为0字节。

你可以给任何关于如何使用AES128 CBC和没有填充,也许是一个例子encryptionstring指针?

谢谢

我find了解决我的问题。 为了使encryption工作没有填充我不得不添加0x0000而不是kCCOptionPKCS7Padding或kCCOptionECBMode哪些处理。

此外,如果需要编码的数据不具有kCCKeySizeAES128(16)的长度倍数,那么包含数据的向量必须调整为具有kCCKeySizeAES128的长度倍数和空值填充的东西。 我加了空格。

  - (NSData *)AES128EncryptWithKey:(NSString *)key { char keyPtr[kCCKeySizeAES128+1]; bzero(keyPtr, sizeof(keyPtr)); [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; int dataLength = [self length]; int diff = kCCKeySizeAES128 - (dataLength % kCCKeySizeAES128); int newSize = 0; if(diff > 0) { newSize = dataLength + diff; } char dataPtr[newSize]; memcpy(dataPtr, [self bytes], [self length]); for(int i = 0; i < diff; i++) { dataPtr[i + dataLength] = 0x20; } size_t bufferSize = newSize + kCCBlockSizeAES128; void *buffer = malloc(bufferSize); size_t numBytesEncrypted = 0; CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, 0x0000, //No padding keyPtr, kCCKeySizeAES128, NULL, dataPtr, sizeof(dataPtr), buffer, bufferSize, &numBytesEncrypted); if(cryptStatus == kCCSuccess) { return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted]; } return nil; }