gpt4 book ai didi

C# 代码到 Objective C 等效代码

转载 作者:太空狗 更新时间:2023-10-30 03:37:43 27 4
gpt4 key购买 nike

我正在尝试将用 C# 编写的代码转换为 objective-c ,我试过了但无法获得相同的结果。任何帮助将不胜感激。

internal static class Common  {
static string encryptionKey = "0C61L2FSL2F3E7X8E9T1L2F3E4O5";
static byte[] salt = new byte[] {0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76};
 
internal static string Encrypt(string clearText)
{
byte[] clearBytes = Encoding.Unicode.GetBytes(clearText);
using (Aes encryptor = Aes.Create())
{
Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(encryptionKey, salt);

encryptor.Key = pdb.GetBytes(32);
encryptor.IV = pdb.GetBytes(16);

using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateEncryptor(), CryptoStreamMode.Write))
{
cs.Write(clearBytes, 0, clearBytes.Length);
cs.Close();
}
clearText = Convert.ToBase64String(ms.ToArray());
}
}
return clearText;
}  
}

以上代码用于加密。我试图在目标中为 RFC2898derivebytes 获取等效函数。

我尝试过的 objective-c 代码:

-(void)doEncryption {

NSString *url = @"www.google.com";

const char salt[] = {0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76};

NSData *saltData =[NSData dataWithBytes:salt length:13];

NSData* myPassData = [EncryptionKey dataUsingEncoding:NSUTF8StringEncoding];


unsigned char key[32];

CCKeyDerivationPBKDF(kCCPBKDF2, myPassData.bytes, myPassData.length, saltData.bytes, saltData.length, kCCPRFHmacAlgSHA1, 1000, key, 32);

unsigned char InitialVector[16];

CCKeyDerivationPBKDF(kCCPBKDF2, myPassData.bytes, myPassData.length, saltData.bytes, saltData.length, kCCPRFHmacAlgSHA1, 1000, InitialVector, 16);


NSString *Aeskey = [[NSString alloc] initWithBytes:key length:sizeof(key) encoding:NSUnicodeStringEncoding];
NSLog(@"Key AES : %@",Aeskey);



NSString *AesIV = [[NSString alloc] initWithBytes:InitialVector length:sizeof(key) encoding:NSASCIIStringEncoding];

NSString *encryptedString = [AESCrypt encrypt:url password:Aeskey andIV:AesIV];


[self doDecryption:encryptedString withKey:nil];
}

最佳答案

您面临的问题是调用 PBKDF2 函数一次并提取前 32 个字节,然后从中提取 16 个字节与调用它两次并从单独的函数调用中提取 32 个字节和 16 个字节是不一样的。目前,您可能会看到 key 的前 16 个字节和 IV 的前 16 个字节是相同的(因为 PBKDF2 在参数确定后是确定性的)。

应该工作的是要求 32 + 16 = 48 个字节,然后提取前 32 个字节作为键,接下来的 16 个字节作为 IV。

一个更好但更难实现的选项是在 PBKDF2 的结果上使用 KBKDF(基于 key 的 key 派生函数)。问题是 PBKDF2 在内部被调用三次以创建 48 字节(因为 SHA-1 的输出大小为 20 字节)。这意味着您必须进行三次调用 - 包括所有迭代 - 而攻击者可能只需要进行一两次调用。

关于C# 代码到 Objective C 等效代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21903905/

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