Есть исходники с использованием
OpenSSL. Есть в Windows родное
CryptoAPI. Кто-нибудь знает как портировать OpenSSL в Windows CryptoAPI? Я в криптографии как свинья в апельсинах, поэтому слёту найти ничего не удалось. Думал там хоть названия функций похожие будут -- ан нет. Так же есть исходники на Java, делающие то же самое, но это для меня тоже тёмный лес. Как хотя бы вот это (на Java) перевести на Windows CryptoAPI? Может знает кто?
try {
final String pbeAlgorithmName = "PBKDF2WithHmacSHA1"; //"PBEWithHmacSHA1AndDESede";
// Derive the proper key from our password.
PBEKeySpec ks = new PBEKeySpec(password, header.getKdfSalt(),
header.getKdfIterationCount(), 192);
SecretKeyFactory fact = SecretKeyFactory.getInstance(pbeAlgorithmName);
Key k = fact.generateSecret(ks);
byte[] keyData = k.getEncoded();
Debug.print("Derived key: 0x" + Util.byteArrayToHexString(keyData));
// Set up the cipher
final String cipherAlgorithmName = "DESede/CBC/PKCS5Padding";
Cipher keyDecryptionCipher = Cipher.getInstance(cipherAlgorithmName);
SecretKeyFactory fact2 = SecretKeyFactory.getInstance("DESede");
Key k2 = fact2.generateSecret(new DESedeKeySpec(keyData));
// Call the version specific unwrap function.
KeySet keys = header.unwrapKeys(k2, keyDecryptionCipher);
Debug.print("AES key: 0x" + Util.byteArrayToHexString(keys.getAesKey()));
Debug.print("HmacSHA1 key: 0x" + Util.byteArrayToHexString(keys.getHmacSha1Key()));
this.aesKey = new SecretKeySpec(keys.getAesKey(), "AES");
this.hmacSha1Key = new SecretKeySpec(keys.getHmacSha1Key(), "HmacSHA1");
keys.clearData(); // No unused keys in memory please.
this.hmacSha1 = Mac.getInstance("HmacSHA1");
this.hmacSha1.init(hmacSha1Key);
this.aesCipher = Cipher.getInstance("AES/CBC/NoPadding");
} catch(Exception e) {
throw new RuntimeException("Exception while trying to decrypt keys.", e);
}
Тут есть не относящиеся к делу переменные, типа header, Debug и пр., я думаю они не помешают понять основной смысл. Как средствами Windows CryptoAPI сделать такую же декриптовку? Какие константы вида CALG_xxx, PROV_xxx надо задавать для получения необходимой дешифрации?