package org.jisonami.crypto;

import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.junit.Test;

import java.security.Key;
import java.security.Security;
import java.util.Map;

/**
 * Created by jisonami on 16-10-15.
 */
public class NonSymmetricCryptographyTest {

    private static final String data = "明文数据test中文";

    /**
     * 测试使用RSA非对称加密算法进行加密解密
     */
    @Test
    public void testRSACrypto() {
        NonSymmetricCryptography nonSymmetricCryptography = new NonSymmetricCryptography();
        Map<String,Key> keyMap = nonSymmetricCryptography.initKey();
        String privateKey = nonSymmetricCryptography.encodeKey(nonSymmetricCryptography.getPrivateKey(keyMap));
        String publicKey = nonSymmetricCryptography.encodeKey(nonSymmetricCryptography.getPublicKey(keyMap));
        System.out.println("RSA私钥:" + privateKey);
        System.out.println("RSA公钥:" + publicKey);
        System.out.println("加密前数据:" + data);
        // 公钥加密私钥解密
        String encryptData = nonSymmetricCryptography.encryptByPublicKey(data, nonSymmetricCryptography.decodeKey(publicKey));
        System.out.println("公钥加密后数据:" + encryptData);
        String decryptData = nonSymmetricCryptography.decryptByPrivateKey(encryptData, nonSymmetricCryptography.decodeKey(privateKey));
        System.out.println("私钥解密后数据:" + decryptData);
        // 私钥加密公钥解密
        String encryptData1 = nonSymmetricCryptography.encryptByPrivateKey(data, nonSymmetricCryptography.decodeKey(privateKey));
        System.out.println("公钥加密后数据:" + encryptData1);
        String decryptData1 = nonSymmetricCryptography.decryptByPublicKey(encryptData1, nonSymmetricCryptography.decodeKey(publicKey));
        System.out.println("私钥解密后数据:" + decryptData1);
    }

    /**
     * ELGAMAL算法只支持公钥加密私钥解密
     */
    @Test
    public void testELGAMALCryptoByBouncyCastle(){
        BouncyCastleProvider bouncyCastleProvider = new BouncyCastleProvider();
        Security.addProvider(bouncyCastleProvider);
        Configuration configuration = new Configuration();
        configuration.setKeyAlgorithm(Algorithms.ELGAMAL).setCipherAlgorithm(Algorithms.ELGAMAL_ECB_PKCS1PADDING).setKeySize(512);
        NonSymmetricCryptography nonSymmetricCryptography = new NonSymmetricCryptography(configuration);
        Map<String,Key> keyMap = nonSymmetricCryptography.initKey();
        String privateKey = nonSymmetricCryptography.encodeKey(nonSymmetricCryptography.getPrivateKey(keyMap));
        String publicKey = nonSymmetricCryptography.encodeKey(nonSymmetricCryptography.getPublicKey(keyMap));
        System.out.println("ELGAMAL私钥:" + privateKey);
        System.out.println("ELGAMAL公钥:" + publicKey);
        System.out.println("加密前数据:" + data);
        // 公钥加密私钥解密
        String encryptData = nonSymmetricCryptography.encryptByPublicKey(data, nonSymmetricCryptography.decodeKey(publicKey));
        System.out.println("公钥加密后数据:" + encryptData);
        String decryptData = nonSymmetricCryptography.decryptByPrivateKey(encryptData, nonSymmetricCryptography.decodeKey(privateKey));
        System.out.println("私钥解密后数据:" + decryptData);
    }

}