How to sign string with private key

后端 未结 5 2068
别那么骄傲
别那么骄傲 2020-12-04 18:02

How can I get the signature of a string using SHA1withRSA if I already have the Private Key as byte[] or String?

5条回答
  •  感动是毒
    2020-12-04 19:04

    I use bouncy-castle to sign data and verify it.

    you should add maven dependency:

    
        org.bouncycastle
        bcprov-jdk15on
        1.56
    
    
        org.bouncycastle
        bcpkix-jdk15on
        1.56
    
    

    Load RSA private or public key from a disk file into a Java object

    First, we need to be able to load RSA private or public key from a disk file into a Java object of a proper class from Bouncy Castle

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import org.apache.commons.lang3.Validate;
    import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
    import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
    import org.bouncycastle.crypto.params.AsymmetricKeyParameter;
    import org.bouncycastle.crypto.util.PrivateKeyFactory;
    import org.bouncycastle.crypto.util.PublicKeyFactory;
    import org.bouncycastle.openssl.PEMKeyPair;
    import org.bouncycastle.openssl.PEMParser;
    
    public class KeyUtil {
    
        public static AsymmetricKeyParameter loadPublicKey(InputStream is) {
            SubjectPublicKeyInfo spki = (SubjectPublicKeyInfo) readPemObject(is);
            try {
                return PublicKeyFactory.createKey(spki);
            } catch (IOException ex) {
                throw new RuntimeException("Cannot create public key object based on input data", ex);
            }
        }
    
        public static AsymmetricKeyParameter loadPrivateKey(InputStream is) {
            PEMKeyPair keyPair = (PEMKeyPair) readPemObject(is);
            PrivateKeyInfo pki = keyPair.getPrivateKeyInfo();
            try {
                return PrivateKeyFactory.createKey(pki);
            } catch (IOException ex) {
                throw new RuntimeException("Cannot create private key object based on input data", ex);
            }
        }
    
        private static Object readPemObject(InputStream is) {
            try {
                Validate.notNull(is, "Input data stream cannot be null");
                InputStreamReader isr = new InputStreamReader(is, "UTF-8");
                PEMParser pemParser = new PEMParser(isr);
    
                Object obj = pemParser.readObject();
                if (obj == null) {
                    throw new Exception("No PEM object found");
                }
                return obj;
            } catch (Throwable ex) {
                throw new RuntimeException("Cannot read PEM object from input data", ex);
            }
        }
    }
    

    Creation of an RSA digital signature

            // GIVEN: InputStream prvKeyInpStream
        AsymmetricKeyParameter privKey = KeyUtil.loadPrivateKey(prvKeyInpStream);
    
        // GIVEN: byte[] messageBytes = ...
        RSADigestSigner signer = new RSADigestSigner(new SHA512Digest());
        signer.init(true, privKey);
        signer.update(messageBytes, 0, messageBytes.length);
    
        try {
            byte[] signature = signer.generateSignature();
        } catch (Exception ex) {
            throw new RuntimeException("Cannot generate RSA signature. " + ex.getMessage(), ex);
        }
    

    Verification of an RSA digital signature

    // GIVEN: InputStream pubKeyInpStream
    AsymmetricKeyParameter publKey = KeyUtil.loadPublicKey(pubKeyInpStream);
    
    // GIVEN: byte[] messageBytes
    RSADigestSigner signer = new RSADigestSigner(new SHA512Digest());
    signer.init(false, publKey);
    signer.update(messageBytes, 0, messageBytes.length);
    
    // GIVEN: byte[] signature - see code sample above
    boolean isValidSignature = signer.verifySignature(signature);
    

提交回复
热议问题