Как подписать строку с закрытым ключом
Как я могу получить подпись строки с помощью SHA1withRSA
, если у меня уже есть закрытый ключ в виде byte[]
или String
?
3 ответа:
Я предполагаю, что вы говорите, что знаете пару ключей до руки и хотите подписать / подтвердить это.
Пожалуйста, смотрите следующий код.
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("Signature:" + 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].
Вы не можете просто иметь произвольный массив байтов в качестве открытого или закрытого ключа. Они должны быть порождены в отношении.
Сначала необходимо создать открытый ключ из массива байтов
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).
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; }