Как применить MD5withRSA к строке в Java - PullRequest
0 голосов
/ 07 февраля 2019

Я новичок в практической криптографии.Я работаю с сервером API третьей части, и я должен подписать все (конкатенация строковых параметров), что я отправляю в API.Для этого мне дали сертификат на основе моего открытого ключа.Теперь я должен применить MD5withRSA к строке и применить Base64 к результату.Это будет параметр подписи, который в конечном итоге проверяет API-сервер.Я не как это сделать в Java.Буду благодарен за любую помощь.

1 Ответ

0 голосов
/ 08 февраля 2019

Я сделал это.

import java.io.*;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Base64;

public class Main {
    private final static String PRIVATE_KEY = "-----BEGIN PRIVATE KEY-----\n" +
            "??????????????????????????????????????\n" +
            "??????????????????????????????????????\n" +
            "??????????????????????????????????????\n" +
            "???????????????????????" +
            "-----END PRIVATE KEY-----";
    public static void main(String[] args) throws Exception {
        String concatedString = "agent:1af:topup:999756:10.00:08/02/2019 09:57:40";
        StringBuilder pkcs8Lines = new StringBuilder();
        BufferedReader rdr = new BufferedReader(new StringReader(PRIVATE_KEY));
        String line;
        while ((line = rdr.readLine()) != null) {
            pkcs8Lines.append(line);
        }
        String pkcs8Pem = pkcs8Lines.toString();
        pkcs8Pem = pkcs8Pem.replace("-----BEGIN PRIVATE KEY-----", "");
        pkcs8Pem = pkcs8Pem.replace("-----END PRIVATE KEY-----", "");
        pkcs8Pem = pkcs8Pem.replaceAll("\\s+","");

        byte [] pkcs8EncodedBytes = Base64.getDecoder().decode(pkcs8Pem);
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(pkcs8EncodedBytes);
        KeyFactory kf = KeyFactory.getInstance("RSA");
        PrivateKey privKey = kf.generatePrivate(keySpec);
        Signature md5withrsa = Signature.getInstance("MD5withRSA");
        md5withrsa.initSign(privKey);

        md5withrsa.update(concatedString.getBytes());
        byte[] res = md5withrsa.sign();
        System.out.println(Base64.getEncoder().encodeToString(res));


    }
}
...