Автор: Артём Макаров В ближайшее время не планировали. Если необходимо использование сейчас - возможно только использование CryptoApi интерфейса CSP через P/Invoke.
Какая задача у вас стоит? Как именно планировалось использовать шифр?
Нужно как-то сделать Unwrap симметричного ключа на с#, или хотя бы на c++. У меня есть код на Java, но я не понимаю, как его повторить на с# или с++.
Код на Java:
Cipher cipher = Cipher.getInstance(WRAP_ALGORITHM, PROVIDER_NAME);
cipher.init(Cipher.UNWRAP_MODE, privateKey);
final SecretKey unwrappedSecretKey = (SecretKey) cipher
.unwrap(wrappedSecret, null, Cipher.SECRET_KEY);
Какой на C++ есть аналог класса Cipher?
Вот полный код метода:
package s.s.sce.crypto;
import ru.CryptoPro.JCP.JCP;
import ru.CryptoPro.JCP.Util.JCPInit;
import ru.CryptoPro.JCP.params.AlgIdSpec;
import ru.CryptoPro.JCP.spec.NameAlgIdSpec;
import ru.CryptoPro.JCP.tools.AlgorithmTools;
import ru.CryptoPro.JCPRequest.GostCertificateRequest;
import ru.CryptoPro.JCSP.JCSP;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
import java.security.spec.AlgorithmParameterSpec;
import java.util.Arrays;
import java.util.Base64;
public class GostCryptoService {
/**
* Алгоритм ключа шифрования.
*/
private static final String SECRET_KEY_ALGORITHM = JCP.GOST_K_CIPHER_NAME;
/**
* Алгоритм шифрования данных.
*/
private static final String CIPHER_ALGORITHM = SECRET_KEY_ALGORITHM + "/CFB/NoPadding";
/**
* Алгоритм экспорта/импорта секретного ключа.
*/
private static final String WRAP_ALGORITHM = JCSP.GOST_TRANSPORT_K;
/**
* Имя провайдера.
*/
private static final String PROVIDER_NAME = JCSP.PROVIDER_NAME;
private static final String CONTAINER_PATH = "\\\\.\\HDIMAGE\\";
private static final String CONTAINER_ALIAS = "secret-cloud";
public GostCryptoService() {
JCPInit.initProviders(true);
}
public void decrypt(String encFilePath) throws Exception {
try (FileInputStream encFis = new FileInputStream(encFilePath)) {
byte[] decodedSecret = new byte[277];
encFis.read(decodedSecret);
byte[] iv = Arrays.copyOfRange(decodedSecret, 261, decodedSecret.length);
byte[] wrappedSecret = Arrays.copyOfRange(decodedSecret, 0, 261);
KeyStore keyStore = KeyStore.getInstance(JCSP.HD_STORE_NAME,
JCSP.PROVIDER_NAME);
keyStore.load(null, null);
PrivateKey privateKey = (PrivateKey) keyStore.getKey(CONTAINER_ALIAS, null);
if (privateKey == null) {
throw new Exception("Приватный ключ не сгенерирован.");
}
Cipher cipher = Cipher.getInstance(WRAP_ALGORITHM, PROVIDER_NAME);
cipher.init(Cipher.UNWRAP_MODE, privateKey);
final SecretKey unwrappedSecretKey = (SecretKey) cipher
.unwrap(wrappedSecret, null, Cipher.SECRET_KEY);
cipher = Cipher.getInstance(CIPHER_ALGORITHM, PROVIDER_NAME);
AlgorithmParameterSpec parameterSpec = new IvParameterSpec(iv);
cipher.init(Cipher.DECRYPT_MODE, unwrappedSecretKey, parameterSpec, null);
String decFileName = new File(encFilePath).getName().split(".enc")[0];
byte[] buffer = new byte[2048];
try (FileOutputStream decrFos = new FileOutputStream(decFileName)) {
int n;
while ((n = encFis.read(buffer)) > 0) {
decrFos.write(cipher.update(buffer), 0, n);
}
}
}
}
}