Как подписать строку с закрытым ключом

159
15

Как получить подпись строки с помощью SHA1withRSA, если у меня уже есть закрытый ключ как byte[] или String?

спросил(а) 2021-01-25T14:36:21+03:00 4 месяца, 4 недели назад
1
Решение
243

Я предполагаю, что вы говорите, знаете ли вы пару ключей перед рукой и хотите подписать/подтвердить это.


См. следующий код.


import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.Signature;

import sun.misc.BASE64Encoder;

public class MainClass {
public static void main(String[] args) throws Exception {

KeyPair keyPair = getKeyPair();

byte[] data = "test".getBytes("UTF8");

Signature sig = Signature.getInstance("SHA1WithRSA");
sig.initSign(keyPair.getPrivate());
sig.update(data);
byte[] signatureBytes = sig.sign();
System.out.println("Singature:" + new BASE64Encoder().encode(signatureBytes));

sig.initVerify(keyPair.getPublic());
sig.update(data);

System.out.println(sig.verify(signatureBytes));
}

private static KeyPair getKeyPair() throws NoSuchAlgorithmException {
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(1024);
return kpg.genKeyPair();
}
}

Здесь вам нужно изменить метод getKeyPair() для предоставления вашей известной пары ключей. Вы можете загрузить его из хранилища ключей java [JKS].


Вы не можете просто иметь произвольный массив байтов либо как ваш открытый ключ, либо закрытый ключ. Они должны генерироваться в зависимости.


Спасибо...

ответил(а) 2021-01-25T14:36:21+03:00 4 месяца, 4 недели назад
77

Сначала вы должны создать открытый ключ из массива байтов


byte publicKeyBytes[] = .... your public key in bytes ... 
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(publicKeyBytes));
PublicKey publicKey = keyFactory.generatePublic(publicKeySpec);

и после использования publicKey для шифрования

String data = "... data to be encrypted ....";
String alg = "RSA/ECB/PKCS1Padding";
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte encryptedBytes[] = cipher.doFinal(data.getBytes());

Теперь только те, у кого есть privateKey, могут читать ваши данные


@rczajka: publicKey - это ключ. Вы можете использовать его, чтобы подписать что-нибудь, что может прочитать только владелец (который имеет privateKey).

ответил(а) 2021-01-25T14:36:21+03:00 4 месяца, 4 недели назад
-4

public static String sign(String samlResponseString, String keystoreFile, String keyStorePassword, String privateKeyPassword, String alias)
throws NoSuchAlgorithmException, UnsupportedEncodingException,
InvalidKeyException, SignatureException {
PrivateKey pkey=getPrivateKey( keystoreFile, keyStorePassword, privateKeyPassword, alias);
String signedString = null;
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initSign(pkey);
signature.update(samlResponseString.getBytes());
byte[] signatureBytes = signature.sign();
byte[] encryptedByteValue = Base64.encodeBase64(signatureBytes);
signedString = new String(encryptedByteValue, "UTF-8");
System.out.println(signedString);
return signedString;
}

ответил(а) 2021-01-25T14:36:21+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема