如何使用私钥对字符串进行签名

如果我已将私钥作为byte[]String如何使用SHA1withRSA获取字符串的签名?

我想你说的是你之前知道的密钥对,并希望签署/validation。

请参阅以下代码。

 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; }