【问题标题】:Encrypt in Objective C or Apple Swift Code with method PBKDF2WithHmacSHA1使用方法 PBKDF2WithHmacSHA1 在 Objective C 或 Apple Swift 代码中加密
【发布时间】:2015-01-14 03:44:33
【问题描述】:

经过长时间的寻找解决方案,我今天来找你。

我想用特定的方法加密一个单词。

这个方法已经用 Java 实现了。我会用客观的 C 语言或 swift 得到同样的结果。

我已经探索了几种方法。例如,我尝试运行 RNCryptManager 或 CPCryptController。但我没有得到确凿的结果。

我的java代码如下:

public String encrypt(String texte) {
   byte[] bytePassword = Base64.decode(PASSWORD, Base64.DEFAULT);
   byte[] byteSalt = Base64.decode(SALT, Base64.DEFAULT);
   byte[] bytesIv = Base64.decode(IV, Base64.DEFAULT);
   SecretKeyFactory factory = null;
   factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
   KeySpec spec = new PBEKeySpec(PASSWORD.toCharArray(), byteSalt, NB_ITER_RFC, 128);
   SecretKey temp = null;
   temp = factory.generateSecret(spec);
   byte[] clef = temp.getEncoded();
   Cipher c = Cipher.getInstance("DESede/CBC/PKCS5Padding");
   IvParameterSpec ivParam = new IvParameterSpec(bytesIv);
   c.init(Cipher.ENCRYPT_MODE, temp, ivParam);     
   byte[] encrypted = c.doFinal(texte.getBytes("UTF-8"));
   mdp = Base64.encodeToString(encrypted, Base64.DEFAULT);
   Log.i("MDP CHIFFRE", " = " + mdp);
}

我打算使用https://developer.apple.com/library/mac/#samplecode/CryptoCompatibility/

我现在的代码是

QCCPBKDF2SHA1KeyDerivation * op;
NSString * passwordString;
NSData * saltData;
NSData * expectedKeyData;

passwordString = @ "Hello Cruel World!";
saltData = [@ "Some salt sir?" dataUsingEncoding: NSUTF8StringEncoding];
expectedKeyData = [QHex dataWithHexString: @ "e56c27f5eed251db50a3"];

op = [[QCCPBKDF2SHA1KeyDerivation alloc] initWithPasswordString: passwordString saltData:   saltData]

op.rounds = 1000;
op.derivedKeyLength = 10;

[[ToolCommon sharedInstance] synchronouslyRunOperation: op];

if (nil == op.error) {
   NSString * newStr = [[NSString alloc] initWithData: op.derivedKeyData encoding:    NSUTF8StringEncoding]
   NSLog (@ "This is it:% @", newStr);
} Else {
    NSLog (@ "Error");
}

但是,当我运行此代码时,我得到一个空结果。 我没有看到或可以来我的错误?什么是转换 PBKDF2-HMAC-SHA1 的正确解决方案?

提前谢谢你。

【问题讨论】:

  • 您提供了用于密钥派生的 Objective-C 代码,但缺少解密代码。
  • 是的,但你知道为什么我需要 null 吗?我应该往哪个方向走?
  • 查看@Cy-4AH 的答案,了解PBKDF2 的实现。使用 Common Crypto,它是内置的。

标签: java objective-c encryption swift pbkdf2


【解决方案1】:

正确的解决方案是:

+ (NSData *)AESKeyForPassword:(NSString *)password 
                         salt:(NSData *)salt {
  NSMutableData *
  derivedKey = [NSMutableData dataWithLength:kAlgorithmKeySize];

  int 
  result = CCKeyDerivationPBKDF(kCCPBKDF2,            // algorithm
                                password.UTF8String,  // password
                                [password lengthOfBytesUsingEncoding:NSUTF8StringEncoding],  // passwordLength
                                salt.bytes,           // salt
                                salt.length,          // saltLen
                                kCCPRFHmacAlgSHA1,    // PRF
                                kPBKDFRounds,         // rounds
                                derivedKey.mutableBytes, // derivedKey
                                derivedKey.length); // derivedKeyLen

  // Do not log password here
  NSAssert(result == kCCSuccess,
           @"Unable to create AES key for password: %d", result);

  return derivedKey;
}

我在这篇文章中找到了这段代码: http://robnapier.net/aes-commoncrypto

【讨论】:

  • P.S. PBKDF2-HMAC-SHA1 不是加密,是密码强化方法。使用 AES256 进行加密。
  • 我必须做一个客观的方法,返回与java方法相同的c结果。
猜你喜欢
  • 2014-10-06
  • 2016-02-16
  • 1970-01-01
  • 1970-01-01
  • 2016-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-22
相关资源
最近更新 更多