使用PKCS7Padding进行AES CBC加密在Java和Objective-C中具有不同的结果

侯赛因·马克图比安(Hossein Maktoobian)

我已经用Java创建了一个适用于Android的应用程序,并使用Cipher类使用AES加密数据。现在,我想将该算法与CommonCrypto一起带入iOS 该代码有效,但结果不同。

这是Java中的代码

public static String Decrypt(String text, String key) throws Exception {
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    byte[] keyBytes = new byte[16];
    byte[] b = key.getBytes("UTF-8");
    int len = b.length;
    if (len > keyBytes.length)
        len = keyBytes.length;
    System.arraycopy(b, 0, keyBytes, 0, len);
    SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
    IvParameterSpec ivSpec = new IvParameterSpec(keyBytes);
    cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
    byte[] results = new byte[text.length()];
    BASE64Decoder decoder = new BASE64Decoder();
    try {
        results = cipher.doFinal(decoder.decodeBuffer(text));
    } catch (Exception e) {
        System.out.print("Erron in Decryption");
    }
    return new String(results, "UTF-8");
}

public static String Encrypt(String text, String key) throws Exception {
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    byte[] keyBytes = new byte[16];
    byte[] b = key.getBytes("UTF-8");
    int len = b.length;
    if (len > keyBytes.length)
        len = keyBytes.length;
    System.arraycopy(b, 0, keyBytes, 0, len);
    SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
    IvParameterSpec ivSpec = new IvParameterSpec(keyBytes);
    System.out.println(keyBytes);
    System.out.println(keySpec);
    System.out.println(ivSpec);
    cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);

    byte[] results = cipher.doFinal(text.getBytes("UTF-8"));
    BASE64Encoder encoder = new BASE64Encoder();
    return encoder.encode(results);
}

这是Objective-C中的代码

+ (NSString*)AES256EncryptData:(NSString*)data WithKey:(NSString*)key {
    char keyPtr[kCCKeySizeAES128]; // 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 = data.length;

    size_t bufferSize           = dataLength + kCCBlockSizeAES128;
    void* buffer                = malloc(bufferSize);

    size_t numBytesEncrypted    = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
                                          keyPtr, kCCKeySizeAES256,
                                          NULL /* initialization vector (optional) */,
                                          data.UTF8String, dataLength, /* input */
                                          buffer, bufferSize, /* output */
                                          &numBytesEncrypted);

    if (cryptStatus == kCCSuccess) {
        return [[NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted] base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn];
    }

    free(buffer); //free the buffer;
    return nil;
}

+ (NSString*)AES256DecryptData:(NSString*)data WithKey:(NSString*)key {
    char keyPtr[kCCKeySizeAES256 + 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 = data.length;

    size_t bufferSize           = dataLength + kCCBlockSizeAES128;
    void* buffer                = malloc(bufferSize);

    size_t numBytesDecrypted    = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
                                          keyPtr, kCCKeySizeAES256,
                                          NULL /* initialization vector (optional) */,
                                          data.UTF8String, dataLength, /* input */
                                          buffer, bufferSize, /* output */
                                          &numBytesDecrypted);

    if (cryptStatus == kCCSuccess) {
        return [[NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted] base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn];
    }

    free(buffer); //free the buffer;
    return nil;
}

更新1:

数据: text to encrypt

钥匙: testkey

Java (所需)结果:7ptTEyImNz9KgC96+JPFXQ==

Objective-C结果: U7FAVHi01q0Hhf+m9NsKjw==

hmak.me

您的问题出在Objective-C代码上。您应该在Java和Obj-C中使用相同的方法。您可以使用以下代码来使其返回相同的结果:

AES文件

#import <Foundation/Foundation.h>
#import <CommonCrypto/CommonCrypto.h>

@interface AES : NSObject 

+ (NSData *)Encrypt:(NSString *)data WithKey:(NSString *)key;
+ (NSString *)Decrypt:(NSData *)data WithKey:(NSString *)key;

+ (NSData *)AESOperation:(CCOperation)operation OnData:(NSData *)data key:(NSString *)key;

@end

AES

#import "AES.h"

@implementation AES

+ (NSData *)Encrypt:(NSString *)data WithKey:(NSString *)key {
    return [self AESOperation:kCCEncrypt OnData:[data dataUsingEncoding:NSUTF8StringEncoding] key:key];
}
+ (NSString *)Decrypt:(NSData *)data WithKey:(NSString *)key {
    return [[NSString alloc] initWithData:[self AESOperation:kCCDecrypt OnData:data key:key] encoding:NSUTF8StringEncoding];
}

+ (NSData *)AESOperation:(CCOperation)operation OnData:(NSData *)data key:(NSString *)key {
    char keyPtr[kCCKeySizeAES128];
    bzero(keyPtr, sizeof(keyPtr));
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

    NSUInteger dataLength = [data length];
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);

    size_t numBytesEncrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(operation,
                                          kCCAlgorithmAES128,
                                          kCCOptionPKCS7Padding,
                                          keyPtr,
                                          kCCBlockSizeAES128,
                                          keyPtr,
                                          [data bytes],
                                          dataLength,
                                          buffer,
                                          bufferSize,
                                          &numBytesEncrypted);
    if (cryptStatus == kCCSuccess) {
        return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
    }

    free(buffer);
    return nil;
}

@end

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用PKCS7Padding进行AES CBC加密在Java和Objective-C中具有不同的结果

来自分类Dev

AES / CBC / PKCS5Padding与AES / CBC / PKCS7Padding具有256键大小的性能Java

来自分类Dev

使用 AES/CBC/PKCS7Padding 加密/解密

来自分类Dev

矢量不随 Java 中的“AES/CBC/pkcs7padding”而改变

来自分类Dev

Java使用aes256 / CBC / PKCS7Padding加密文件

来自分类Dev

AES-256和PKCS7Padding在Java中失败

来自分类Dev

将文本加密为AES / CBC / PKCS7Padding

来自分类Dev

在iOS中使用AES / CBC / PKCS7Padding 128位算法在Android中加密的解密字符串的问题

来自分类Dev

使用 PHP OpenSSL 将 Java AES/ECB/PKCS7Padding/ 代码转换为 PHP

来自分类Dev

Java Encrypt a file using aes256/ CBC/PKCS7Padding

来自分类Dev

在Dart中解密AES / CBC / PKCS5Padding加密

来自分类Dev

所有类型的Android设备均可使用AES / CBC / PKCS5Padding加密解密算法和SHA-1哈希算法吗

来自分类Dev

C#中的Java AES / CBC / PKCS5Padding

来自分类Dev

php和java之间具有不同的零填充加密结果的不同AES128

来自分类Dev

使用 AES/ECB/NoPadding 与 PKCS5Padding 进行加密

来自分类Dev

从ColdFusion加密解密NodeJS中的AES / CBC / PKCS5Padding

来自分类Dev

Java和openssl C不同的AES CTR加密结果

来自分类Dev

在C#和PHP中,AES加密的结果不同

来自分类Dev

如何在dart中使用AES CBC 256位和PKCS5Padding进行加密和解密以及如何检索参数

来自分类Dev

AES256加密在node.js和Objective-c之间得到不同的结果

来自分类Dev

如何使用Objective-c实现AES PKCS5Padding

来自分类Dev

Ruby中的Coldfusion“ AES / CBC / PKCS5Padding”解密

来自分类Dev

为什么使用Android和JavaScript在AES / CBC / ZeroBytePadding中加密会为某些字符串返回不同的结果?

来自分类Dev

从Java到PHP的带有SecretKey的AES CBC PKCS5Padding

来自分类Dev

Android / Java AES 256 CBC与PHP中的PKCS5Padding解密

来自分类Dev

Android / Java AES 256 CBC与PHP中的PKCS5Padding解密

来自分类Dev

PHP中的AES / CBC / PKCS#5加密算法

来自分类Dev

AES / cbc / pkcs5padding加密IOS

来自分类Dev

使用BouncyCastle(java)和Gcrypt(C)进行加密可得出不同的结果

Related 相关文章

  1. 1

    使用PKCS7Padding进行AES CBC加密在Java和Objective-C中具有不同的结果

  2. 2

    AES / CBC / PKCS5Padding与AES / CBC / PKCS7Padding具有256键大小的性能Java

  3. 3

    使用 AES/CBC/PKCS7Padding 加密/解密

  4. 4

    矢量不随 Java 中的“AES/CBC/pkcs7padding”而改变

  5. 5

    Java使用aes256 / CBC / PKCS7Padding加密文件

  6. 6

    AES-256和PKCS7Padding在Java中失败

  7. 7

    将文本加密为AES / CBC / PKCS7Padding

  8. 8

    在iOS中使用AES / CBC / PKCS7Padding 128位算法在Android中加密的解密字符串的问题

  9. 9

    使用 PHP OpenSSL 将 Java AES/ECB/PKCS7Padding/ 代码转换为 PHP

  10. 10

    Java Encrypt a file using aes256/ CBC/PKCS7Padding

  11. 11

    在Dart中解密AES / CBC / PKCS5Padding加密

  12. 12

    所有类型的Android设备均可使用AES / CBC / PKCS5Padding加密解密算法和SHA-1哈希算法吗

  13. 13

    C#中的Java AES / CBC / PKCS5Padding

  14. 14

    php和java之间具有不同的零填充加密结果的不同AES128

  15. 15

    使用 AES/ECB/NoPadding 与 PKCS5Padding 进行加密

  16. 16

    从ColdFusion加密解密NodeJS中的AES / CBC / PKCS5Padding

  17. 17

    Java和openssl C不同的AES CTR加密结果

  18. 18

    在C#和PHP中,AES加密的结果不同

  19. 19

    如何在dart中使用AES CBC 256位和PKCS5Padding进行加密和解密以及如何检索参数

  20. 20

    AES256加密在node.js和Objective-c之间得到不同的结果

  21. 21

    如何使用Objective-c实现AES PKCS5Padding

  22. 22

    Ruby中的Coldfusion“ AES / CBC / PKCS5Padding”解密

  23. 23

    为什么使用Android和JavaScript在AES / CBC / ZeroBytePadding中加密会为某些字符串返回不同的结果?

  24. 24

    从Java到PHP的带有SecretKey的AES CBC PKCS5Padding

  25. 25

    Android / Java AES 256 CBC与PHP中的PKCS5Padding解密

  26. 26

    Android / Java AES 256 CBC与PHP中的PKCS5Padding解密

  27. 27

    PHP中的AES / CBC / PKCS#5加密算法

  28. 28

    AES / cbc / pkcs5padding加密IOS

  29. 29

    使用BouncyCastle(java)和Gcrypt(C)进行加密可得出不同的结果

热门标签

归档