簡體   English   中英

如何使Xcode加密字符串與Java中的加密字符串相同

[英]How can i make an xcode encrypted string same as encrypted string in java

我是xcode的新手。 我正在用xcode加密字符串,也在Java中使用AES 256位加密相同的字符串,並且遇到了一些奇怪的問題。 Java和Iphone中的加密彼此不匹配,我使用了以下代碼:

NSString *password = @"mypassword";
NSString *str = @"message"; 
NSLog(@"encrypting string =%@",str);
NSData *data = [str dataUsingEncoding: NSASCIIStringEncoding];
NSData *encryptedData = [data AES256EncryptWithKey:password];
NSString *responseString = [[NSString alloc] initWithData:encryptedData encoding:NSASCIIStringEncoding];
[Base64 initialize];
NSString *b64EncStr = [Base64 encode:encryptedData];

NSLog(@"Base 64 encoded = %@",b64EncStr);
NSData  *b64DecData = [Base64 decode:b64EncStr];
NSData *decryptedData = [b64DecData AES256DecryptWithKey:password];
NSString* decryptedStr = [[NSString alloc] initWithData:decryptedData encoding:NSASCIIStringEncoding];
NSLog(@"decrypted string = %@",decryptedStr);

 /////////////////************///////////////***************************/////////////////////

 - (NSData *)AES256EncryptWithKey:(NSString *)key {
char keyPtr[kCCKeySizeAES256 + 1]; 
bzero( keyPtr, sizeof( keyPtr ) ); 
 [key getCString:keyPtr maxLength:sizeof( keyPtr )
 encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [self length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc( bufferSize );

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

    >free( buffer ); 
    >return nil; }




- (NSData *)AES256DecryptWithKey:(NSString *)key {
char keyPtr[kCCKeySizeAES256+1]; 
bzero( keyPtr, sizeof( keyPtr ) ); 
[key getCString:keyPtr maxLength:sizeof( keyPtr )
 encoding:NSUTF8StringEncoding];

    NSUInteger dataLength = [self length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc( bufferSize );
 size_t numBytesDecrypted = 0;
 CCCryptorStatus cryptStatus = CCCrypt( kCCDecrypt,
 kCCAlgorithmAES128, kCCOptionPKCS7Padding,
                                           keyPtr, kCCKeySizeAES256,
                                           NULL ,
                                           [self bytes], dataLength, 
                                           buffer, bufferSize, 
                                           &numBytesDecrypted );

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

 free( buffer ); 
 return nil; }

我在xcode中得到一個加密的字符串nd1+bWMbk+BEnr9uPIq2eQ==

但是在java中使用以下代碼我正在加密它

SecretKeySpec spec = getKeySpec();
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, spec);
BASE64Encoder enc = new BASE64Encoder();
String hexString = stringToHex(text);
>return enc.encode(cipher.doFinal(hex2byte(hexString)));

並且加密的字符串是mCP+z7ZqxDWPoJPaPoVfSw==我無法在Java中找到理想的解決方案?

我已經添加了加密標簽。 您需要確保雙方相同。 雙方必須以相同的密鑰,相同的IV(可能需要傳遞)和相同的填充(使用PKCS7)在相同模式(使用CBC模式)中使用AES-256。

如果您依賴默認值,那么您會發現默認值有所不同,您將獲得不同的結果。

您還在使用文本字符串。 您還需要確保雙方都使用相同的文本編碼,最好是UTF-8。 首先使用字節數組檢查內容可能會更容易,以消除文本處理中可能出現的問題。 字節數組正常工作后,您隨時可以再添加文本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM