Как подписать строку закрытым ключом - PullRequest
17 голосов
/ 29 августа 2011

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

Ответы [ 3 ]

45 голосов
/ 29 августа 2011

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

Пожалуйста, смотрите следующий код.

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].

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

0 голосов
/ 08 июня 2016
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;
    }
0 голосов
/ 25 июля 2013

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

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).

...