Инструкция по использованию примера подписи сообщения на языке Java

Компиляция и запуск примера:

  1. Сформируйте файл закрытого ключа kkm.kst выполнив команду
    keytool -genkey -keystore kkm.kst -storepass qwerty -alias kkmcert 
    -keypass qwerty -keyalg RSA -keysize 1024 -sigalg MD5WithRSA 
    -validity 365 -dname CN=tester
    
  2. Создайте каталог ru\eport\demo в котором разместите файлы
    1. SignString.java с текстом из примера
    2. Base64.java с текстом доступным по ссылке
  3. Скомпилируйте приложение командой
    javac ru\eport\demo\*.java
    
  4. Запустите программу командой
    java -cp . ru.eport.demo.SignString
    

package ru.eport.demo;

import java.io.FileInputStream;
import java.io.UnsupportedEncodingException;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.Signature;

public class SignString {
	private static final String TRANSFER_ENCODING = "windows-1251";

	public static void main(String [] args) {
		try {
	        KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
	        //Файл-хранилище ключей (keystore)
	        String keyStoreFile = "kkm.kst";
	        FileInputStream fis = new FileInputStream(keyStoreFile);
	        //Пароль хранилища ключей
	        String keyStorePassword = "qwerty";
	        //Загрузка ключа
	        keyStore.load(fis, keyStorePassword.toCharArray());
	        fis.close();
	        //Название клиенсткого сертификата
	        String myKeyAlias = "kkmcert";
	        //Пароль закрытого ключа
	        String myKeyPassword = "qwerty";
	        //Загрузка закрытого ключа
			PrivateKey privateKey = (PrivateKey) keyStore.getKey(myKeyAlias, myKeyPassword.toCharArray());
	        if(privateKey == null) throw new Exception("Client key not found");

	        //Текст для подписи
	        String text = "This is a test data";
	        //Создание подписывателя
	    	Signature signature = Signature.getInstance("MD5withRSA");
	    	signature.initSign(privateKey);
	    	//Данные в формате для подписи
	    	byte [] data;
	    	try {
	    		//Получение байтов в нужной кодировке
	    		data = text.getBytes(TRANSFER_ENCODING);
	    	} catch (UnsupportedEncodingException e) {
	    		data = text.getBytes();
	    	}
	    	//Создание подписи
	        signature.update(data);
	        //Получение подписанных данных
	        byte [] sign = signature.sign();
	        //Преобразование в Base64
	        String signString = Base64.encode(sign);
	        System.out.println(signString);
		
		} catch (Exception e) {
			System.err.println("Ошибка при генерации подписи");
			e.printStackTrace();
		}
		
	}
}