SM2Engine может шифровать, но как добавить конверт на него? - PullRequest
0 голосов
/ 17 мая 2018

Я могу получить открытый ключ из файла сертификата и использовать приведенный ниже код для шифрования сообщения с помощью 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...