Я могу получить открытый ключ из файла сертификата и использовать приведенный ниже код для шифрования сообщения с помощью sm2engine.
public static String encrypt(String data, PublicKey publicKey)
{
ECPublicKeyParameters localECPublicKeyParameters = null;
if (publicKey instanceof BCECPublicKey)
{
BCECPublicKey localECPublicKey = (BCECPublicKey)publicKey;
ECParameterSpec localECParameterSpec = localECPublicKey.getParameters();
ECDomainParameters localECDomainParameters = new ECDomainParameters(
localECParameterSpec.getCurve(), localECParameterSpec.getG(),
localECParameterSpec.getN());
localECPublicKeyParameters = new ECPublicKeyParameters(localECPublicKey.getQ(),
localECDomainParameters);
}
SM2Engine localSM2Engine = new SM2Engine();
localSM2Engine.init(true, new ParametersWithRandom(localECPublicKeyParameters,
new SecureRandom()));
byte[] arrayOfByte2;
try
{
arrayOfByte2 = localSM2Engine.processBlock(data.getBytes(), 0, data.getBytes().length);
return new String(Base64.encode(arrayOfByte2));
}
catch (InvalidCipherTextException e)
{
e.printStackTrace();
return null;
}
Но это не конверт, я не знаю, как добавить конверт на него, но я знаю, как добавить конверт без sm2egine:
public static String encryptMessage(String message, X509Certificate cert) throws Exception {
CMSEnvelopedDataGenerator gen = new CMSEnvelopedDataGenerator();
gen.addRecipientInfoGenerator(new JceKeyTransRecipientInfoGenerator(cert));
OutputEncryptor encryptor = new JceCMSContentEncryptorBuilder(CMSAlgorithm.AES128_CBC).setProvider(BouncyCastleProvider.PROVIDER_NAME).build();
CMSTypedData content = new CMSProcessableByteArray(message.getBytes("UTF-8"));
CMSEnvelopedData data = gen.generate(content, encryptor);
String encryptedMessage = new String(Base64.encode(data.getEncoded()));
return encryptedMessage;
}
но теперь я должен использовать специальный алгоритм sm4 в качестве симметричного алгоритма для шифрования содержимого в первую очередь, а не aes. А затем использовать sm2 для шифрования ключа sm4, как это определено в pkcs7 . так как соединить эти два фрагмента кода?
Все специальные алгоритмы могут быть реализованы с помощью метода BouncyCastle, но в классе CMSAlgorithm отсутствует sm4, но я нашел GMObjectIndenrifier.sms4_cbc и передал его в качестве параметра, но получил исключение:
no such algorithm.
Дополнительная информация: после того, как я проанализирую сертификат из файла и вызову certificate.getSigAlgName (), его имя будет SM3WITHSM2