Мне нужно портировать метод decrypt с Java на C++, какой на C++ аналог класса Cipher. В этом методе сначала расшифровывается ключ, а потом само сообщение.
И какие есть аналоги JCP.GOST_K_CIPHER_NAME, JCSP.GOST_TRANSPORT_K?
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);
}
}
}
}
}
Отредактировано пользователем 23 декабря 2021 г. 11:03:09(UTC)
| Причина: Не указана