2016-06-07 71 views
2

我從來沒有使用C++,但現在我需要這個功能移植到C++:PBEKeySpec C++模擬

public static byte[] getSafeKey(String key, byte[] initVector) { 
    KeySpec keySpec = new PBEKeySpec(key.toCharArray(), initVector, 
      ITERATION_COUNT, KEY_LENGTH); 
    SecretKeyFactory keyFactory = null; 
    try { 
     keyFactory = SecretKeyFactory 
       .getInstance("PBKDF2WithHmacSHA1"); 
    } catch (NoSuchAlgorithmException e) { 
     e.printStackTrace(); 
    } 
    byte[] keyBytes = new byte[0]; 
    try { 
     keyBytes = keyFactory.generateSecret(keySpec).getEncoded(); 
    } catch (InvalidKeySpecException e) { 
     e.printStackTrace(); 
    } 
    SecretKey skey = new SecretKeySpec(keyBytes, "AES"); 

    return skey.getEncoded(); 
} 

到目前爲止,我發現了一個PBEKeySpec模擬:http://beecrypt.sourceforge.net/doxygen/c++/classbeecrypt_1_1crypto_1_1spec_1_1PBEKeySpec.html

但即使如此,我也不知道如何處理keyFactory和更遠。

有沒有簡單的方法來寫它在C + +?

+0

我刪除了Crypto ++標記。您在使用該技術時應該添加標籤;而不是「我該怎麼做,我該怎麼做?」的問題。 – jww

+0

是的,當然。不會再做。其實我在項目中使用它,這就是爲什麼我添加標籤。 – Shur

回答

1

對於託管代碼,您可能可以使用嚴重名爲Rfc2898DeriveBytesRFC 2898定義了PKCS#5:基於密碼的加密。此版本包含PBKDF2密碼散列(如果必須,則爲密碼派生函數)。

對於非託管代碼,似乎有an implementation of PBKDF2 in Crypto++。請注意,Java版本中的哈希也在HMAC構造中使用。 Botan也是一種選擇。

請注意,Java版本直接使用密碼的最低8位值char。所以它可能與其他非ASCII字符的實現不兼容。