Knowledge_Seeker 2 Ответов: 1

Шифрование RSA с использованием существующего текстового файла открытого ключа в JAVA


У меня есть текстовый файл с открытым ключом(.txt), содержащий открытый ключ. Как я могу зашифровать любое входное строковое значение с помощью этого открытого ключа в JAVA?
Пожалуйста, укажите мне код для чтения текстового файла открытого ключа, который может быть расположен на любом из дисков, а затем зашифруйте любую строку с помощью этого открытого ключа.
Я написал приведенный ниже код, но он показывает сообщение об ошибке:
-Ява,служба безопасности.KeyStoreException: RSA не найден
Зашифрованные данные:=null"

Пожалуйста, помогите!

Что я уже пробовал:

Я попробовал следующий код, но я получаю сообщения об ошибках.

import java.security.KeyStore;
import java.security.MessageDigest;
import org.bouncycastle.crypto.params.AsymmetricKeyParameter;
import java.security.PublicKey;
import org.bouncycastle.crypto.CipherParameters;
import org.bouncycastle.crypto.BufferedAsymmetricBlockCipher;
import org.bouncycastle.crypto.Digest;
import org.bouncycastle.crypto.AsymmetricBlockCipher;
import org.bouncycastle.crypto.encodings.OAEPEncoding;
import org.bouncycastle.crypto.digests.SHA1Digest;
import org.bouncycastle.crypto.digests.SHA256Digest;
import org.bouncycastle.crypto.engines.RSABlindedEngine;
import org.bouncycastle.crypto.util.PublicKeyFactory;
import java.io.InputStream;
import java.security.cert.X509Certificate;
import java.security.cert.CertificateFactory;
import java.io.FileInputStream;
import java.security.Provider;
import java.security.Security;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import javax.crypto.Cipher;
import java.io.InputStream;
import java.security.*;
//import java.util.Base64;

@SuppressWarnings("unused")
public class Encryption
{
    public String encrypt(final String inputData) {
        String encryptedData = null;
        try {
            Security.addProvider((Provider)new BouncyCastleProvider());
            final FileInputStream fin = new FileInputStream("D:/publickey.txt");
            System.out.println("hello"+fin);
            
            final CertificateFactory cf = CertificateFactory.getInstance("X.509", "BC");
            System.out.println("hello1"+cf);
            KeyStore keyStore = KeyStore.getInstance("RSA");
            
            final java.security.cert.Certificate cert = keyStore.getCertificate("D:/publickey.txt");
            System.out.println("hello2"+cert);
            
            final PublicKey pubkey = cert.getPublicKey();
            final AsymmetricKeyParameter publicKeyParameter = PublicKeyFactory.createKey(pubkey.getEncoded());
            final OAEPEncoding enCryptor = new OAEPEncoding((AsymmetricBlockCipher)new RSABlindedEngine(), (Digest)new SHA256Digest(), (Digest)new SHA1Digest(), (byte[])null);
            final BufferedAsymmetricBlockCipher cipher = new BufferedAsymmetricBlockCipher((AsymmetricBlockCipher)enCryptor);
            cipher.init(true, (CipherParameters)publicKeyParameter);
            cipher.processBytes(inputData.getBytes(), 0, inputData.length());
            encryptedData = Base64.encodeBytes(cipher.doFinal());
        }
        catch (Exception e) {
            System.out.println(e);
        }
        return encryptedData;
    }
    
    public String getSha256(final String value) {
        try {
            final MessageDigest md = MessageDigest.getInstance("SHA-256");
            md.update(value.getBytes());
            return this.bytesToHex(md.digest());
        }
        catch (Exception ex) {
            throw new RuntimeException(ex);
        }
    }
    
    private String bytesToHex(final byte[] bytes) {
        final StringBuffer result = new StringBuffer();
        for (final byte b : bytes) {
            result.append(Integer.toString((b & 0xFF) + 256, 16).substring(1));
        }
        return result.toString();
    }
}

phil.o

Пожалуйста улучшите свой вопрос и предоставьте также сообщение(ы) об ошибке.

1 Ответов

Рейтинг:
1

phil.o

Хранилище ключей (Java Platform SE 6)[^]

Вы можете попробовать

KeyStore keyStore = KeyStore.getInstance("JKS");
вместо.

Или использовать Безопасности.getProviders()[^] метод, чтобы иметь представление о зарегистрированных провайдерах в вашей системе.


Knowledge_Seeker 2

я не понял ваш упомянутый метод-Security.getProviders() ? Пожалуйста, уточните!

phil.o

Этот статический метод возвращает массив зарегистрированных поставщиков в системе.
Поместите его куда-нибудь в свой код, поставьте точку останова на его строке, начните отладку и следите за возвращаемым массивом.