gpt4 book ai didi

java - 我怎样才能使xcode加密字符串与java中的加密字符串相同

转载 作者:太空宇宙 更新时间:2023-11-04 08:31:44 28 4
gpt4 key购买 nike

我是 xcode 新手。我正在 xcode 中加密一个字符串,并使用 AES 256 位在 Java 中加密相同的字符串,但我看到了一些奇怪的问题。 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中找到完美的解决方案?

最佳答案

我已经添加了加密标签。您需要确保两侧相同。双方必须在相同模式(使用 CBC 模式)下使用 AES-256,并具有相同的 key 、相同的 IV(您可能需要传递它)和相同的填充(使用 PKCS7)。

如果您依赖默认值,那么您会发现默认值不同,您会得到不同的结果。

您还使用文本字符串。您还需要确保双方使用相同的文本编码,最好是 UTF-8。首先使用字节数组检查内容可能会更容易,从而消除文本处理可能出现的问题。一旦字节数组正常工作,您就可以随时将文本添加回来。

关于java - 我怎样才能使xcode加密字符串与java中的加密字符串相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7344117/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com