Чтение формата закрытого ключа PKCS # 1 в java

Seyyed Hossein SeyyedAghaei Re спросил: 28 апреля 2018 в 09:45 в: java

Я хочу подписать данные с закрытым ключом RSA в java. Закрытый ключ следует за форматом PKCS # 1 и, к сожалению, я не нашел никакого файла метода или jar, чтобы читать закрытый ключ и подписать данные в java. Обратите внимание, что есть несколько вопросов и все, что было найдено, чтобы изменить формат закрытого ключа с PKCS # 1 на PKCS # 8 в качестве комплексного решения. Это означает полное изменение частного ключа и изменение окончательных подписанных данных. Есть ли многообещающий ответ на эту проблему? Спасибо миллиону.

Вот данные, которые я хочу подписать с помощью закрытого ключа

1A2B3C8D9JCDFGHJKLDMNFDH1A2B3C8D9JCDFGHJKLDMNFDH52018-05-20T12:52:50.553+04:30parsian-bank.ir

закрытый ключ

-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA5T2JQe6YRsB/nhLRJAz/GabpNXzyhJdn6SthkTkrKzp7FZNm
5/cDyHorXcpLdGlyWr1Qapf4CaxdA1GkFJamdg/xro2TGwzQ9x/O18DIUhaH4IGf
QAKaDcc+P9Uo5k4d/Nbah3nyjwk5xQApGSG9KcDTmGIOaPpag581vbLAf4x45BSa
r9vc0uiZHqAUAj1XkM3Zci9dSecASZaDjIhKI62Xv0Q1dfzu1NLGBMB1q4HgCaR6
P7J0S7iAK3EX1Ej6YJ9YlQflThBjQGScUO3Z5vMLHXpQd7eNzmqhpzFwo2yHFNg/
marMFVpBcwQuVtbjG2Mu3OCsUDU/RL6bWulMTwIDAQABAoIBAQDaZ2lpBo/QAMDV
cqoNRdCZuPtBOZy5FKMsdGdNfAET+3CfGsOVRzM0gqjkf8Kp03je2LVQCR+I383y
RoskDm/j1cb1/e5kfC5u88AWsJZqFws3q2d1DcWGUQiOumBwI4bQiEbFgjrFag2/
EisVxZ46tHskGHAQNk2cT0hdRnu+R+J+oIK0TtkrTCvcI4RW1LKYrv0X1+0XcB4K
mSVADttsJlJ3LBEdia0C9L2GDzILI+q4hXXnF07dcUGz/jbltjxsI5tIFiAWkjBu
usBgW2CI9rVdqeUgnkbCf0MjJ1o09dnfRzkxjJYuuM5Z+oCcgdlQlJs7541rUErP
pc20Z4uJAoGBAPfySkptuh8/1K/fsYZQa+9mg3UCSIoEOmKkhkutOxGbhFlI6Jqw
xZsEu2CUFqSYuGLYXm99nVlTPBeSHPTHZrhbe6rHAY32L6lfNiVyjIcObd9UtdI8
GhMCWmWGfYIJpwA00DkTeo20zMzXUNYpAtp9LyyI4JMXNsTH4NB35KitAoGBAOyv
s8yOAh2BeZ6Elt5wSI4nfOay7rje6kLu8+uwdnkbXEQX/XFYd/H9AxQqpQkhnvwh
ffCQp/OBS1jtfmuxx/8wQkvHc2eUnTcnzrAXig/J8qK4PDr7h80puUiWAHxcbVg+
ykoyFPi3hIqzLHXOOxFDXBh3Tm6MXmfbi5HUj3xrAoGAN7Ob0vqxnIGXg2dKl3UL
un2aPLglmbP3dd+mN+wT4BHC+tfxQYdC7V9zxO+f4pxYmAQpuvxKVB3p2xW9IZSG
VBZhQu1wQPc0n+U+4czJGzI3prt+GVvdM7YMntBG8+a9OMOkn53ro1ghxkb85w/R
j0oeRe/+G61UZYLN06eLnAUCgYAr1wObsPYNVw0a4n47Z1rZEdFdvejfz1Je4XnG
vyHCnuHBLxxfoT5eUTn/w0JcZaDYHLACHhktzlYRe7P96KkdyGePN7tVhT51l+b9
0O5erE5H+44UcsCdrMvH+RjP8CLExKSdh5dA1mUzd6qVi4R/VxW45mhdq5xU6mJ4
uYF2TwKBgQDogEId7bajOHGpp0bvAMu+0S/PoJrIFQmjIhPKrUgA2K8nbinzExEF
oD27ZFnbXe3aO2J0hRANUWtUCLoX/3OczVs7H1ffNxIs/D+9DtqWJqV8Rj/mCAWl
MAH9y2KV8DkA/lXSK/sFzBZQLjhjzm9PQFVJQ7bgbQMmwop2VaYDLw==
-----END RSA PRIVATE KEY-----

Вот ожидаемый результат:

HzO+QqTuy6IVYVtEsoHPw8ZXFiSj/Vtw9nFJEDzYP+UYPTiv270Vv3QBuh2dujdTE+5bbDvocroK9aK5Tl0fhTvNnKIntGExDETnUU6t3IvUDkhyQWsPN5nokdELa0mhY/ZVPZwXLbSBE8BoX3UG71OWUvZ+/B6lxSJBCwij28+PI4fiPWwHPiWDgsSEts1g13NtRgPkHDf57Q20OF6y5t+bdwC38DFoj0yuwmkfHxoNl4JwWO01pPWpaMnmW0r+AISysY+ZbmC64tGlu7PKCmWxixkxeaSyUNiA+A8R5xoE9ly3Atep0SfpAVOb5grITHH43ITXo0kRCOcr+m+Eig==

И результат, который получает форму, изменяющую PKCS # 1 на PKCS # 8

Z49gXHUPlhiNaQgZD9X1ITLo4RgRUs9iJsk486H2jepCcHGR20GcbIKciANqDRuWHc4Q8bZTqLWXvXm3pCfov2KjNdR73TskdtWkdLUdOK4lpN5gc5GLEZreQq4CzXIJqTvE1KAViEHHYj3FJz7DViuTJ8P93urK95YfZOiyEwy9aCD93i8WgPq8Uypkx7tH31JOAj4Tk3E2NfE5Jbw6Awb/5v3sCScmdnr5P7UxCIQjeB20LzpQsQpWsTVACbj5UOensj+tRH3oxDbDfweTOtqRIeNpTJGFnDE4rdPBBtCZZ5Nv5xmKTg0ZZAiUGAUaCuUSDjihjTMXUXDmosrznA==


1 ответ

VaibhavSharma ответил: 30 апреля 2018 в 05:19

Вы можете прочитать секретный ключ, так как здесь certiPath - это путь к вашему сертификату, а пароль - это пароль, который вы используете для создания сертификата и - это псевдоним, который вы использовали при создании сертификата.

        String certiPath = "D:" + File.separator + "authToken.p12";
        KeyStore keystore = KeyStore.getInstance("PKCS12");
        keystore.load(new FileInputStream(new File(certiPath)), "password".toCharArray());
        PrivateKey privateKey = (PrivateKey) keystore.getKey("alias", "password".toCharArray());

Для подписания вы можете сделать что-то вроде:

Signature signature = Signature.getInstance("SHA256withRSA");
signature.initSign(privateKey);
signature.update("string to sign");

Для использования PKCS # 1 вы можете использовать BouncyCastle, как указано ниже

import java.security.Key;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.SecureRandom;
import java.security.Security;import javax.crypto.Cipher;public class MainClass {
  public static void main(String[] args) throws Exception {
    Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());    byte[] input = "abc".getBytes();
    Cipher cipher = Cipher.getInstance("RSA/None/PKCS1Padding", "BC");
    SecureRandom random = new SecureRandom();
    KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", "BC");    generator.initialize(256, random);    KeyPair pair = generator.generateKeyPair();
    Key pubKey = pair.getPublic();
    Key privKey = pair.getPrivate();    cipher.init(Cipher.ENCRYPT_MODE, pubKey, random);
    byte[] cipherText = cipher.doFinal(input);
    System.out.println("cipher: " + new String(cipherText));    cipher.init(Cipher.DECRYPT_MODE, privKey);
    byte[] plainText = cipher.doFinal(cipherText);
    System.out.println("plain : " + new String(plainText));
  }
}
dave_thompson_085 ответил: 28 апреля 2018 в 06:31
Это для PKCS12, который почти полностью не похож на PKCS1.
VaibhavSharma ответил: 30 апреля 2018 в 06:05
Я добавил код для PKCS1
dave_thompson_085 ответил: 01 мая 2018 в 07:13
Это PKCS1 шифрование даже не подписи (которая по-прежнему не является Q) гораздо меньше PKCS1 ключевого формата , который является Q.