欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java非对称加密算法(java代码大全及详解)

程序员文章站 2023-11-12 17:29:22
我们在做技术接口时,尤其对外提供时,为了提高服务接口的安全(防爆破,防重放,防篡改等)一般会采用接口验证的方式,但是在验证的时候为了提升参数请求前后的安全,我们会采用加密。普通加密基本都是对称的,不能...

我们在做技术接口时,尤其对外提供时,为了提高服务接口的安全(防爆破,防重放,防篡改等)一般会采用接口验证的方式,但是在验证的时候为了提升参数请求前后的安全,我们会采用加密。普通加密基本都是对称的,不能逆向。

下面,我介绍一种rsa的算法,通过这个加密算法实现接口请求前后的数字签名验证。具体实现流程为:

java非对称加密算法(java代码大全及详解)

接口数字签名验证的而基本流程

下面我将rsa的签名算法代码分享下,下载即用:

public class rsaencrypt {


    private static map<integer, string> keymap = new hashmap<integer, string>();  //用于封装随机产生的公钥与私钥

    private static string pirvatekey="miibuwibadanbgkqhkig9w0baqefaascat0wgge5ageaakeags8vf8ekvf9yoqoyhfy4hhgypnkskrrmkjrfrkezhfzwfx2ccoon74qz3qw15vv9jmd5dwapdmvavx5hcknurwidaqabakbps6fwd4pwmini4usula1shdmqfc0pycisd8odbrattjrv6w9oh+a/cikdir4dz0pss9qh0mxb0bthrq9vs0wbaieax+y2vcrbnoznqswuonzcvkihazkrawxobr8mqfjnoucciqclavcvg0seskwv65vs2zr0quqnafdccmh7b4gm2dcnaqigasxgvy3jv+hd1/j6fnnuuoqw0cbp1sofsmh9mlr3xy8cifeygex9cay/vstwalws3pmbgxxy2jdb2u6q86vx5rubaibhoiuoyrxrs77ifdfm1kyfhrpyznstyjhcvu4u5kwwia==";
    private static string publickey="mfwwdqyjkozihvcnaqebbqadswawsajbaievfx/hilx/wkkqmorcuir4gktzepk65pca36ynmr32vhcdnaqkj++egd6snevvfyza+q1mj3tfqfcer3jdveccaweaaq==";
    private static string ssb="fsauucym3fi3eyjwzrpxni1dbwclt3bfuql5wsdv24qtlmymrn2i5wrkqggxmtewrj78obf1zke9rtpe+23zzw==";

    public static void main(string[] args) throws exception {
        //生成公钥和私钥
        //genkeypair();
        //string randomstr= randomstrutil.getrandom(24, randomstrutil.type.letter_capital_number);
        string uuid=uuidutil.getuuid();
        string hashcode=string.valueof(uuid.hashcode());
        system.out.println("hashcode="+hashcode);
        long time=system.currenttimemillis();
        //system.out.println("随机hash"+hashcode);
        //加密字符串
        string message = time+"@=@"+uuid;
        //system.out.println("随机生成的公钥为:" + publickey);
        //system.out.println("随机生成的私钥为:" + pirvatekey);
        string messageen = encrypt(message,publickey);
        system.out.println("加密后的字符串为:" + messageen);
        string messagede = decrypt(messageen,pirvatekey);
        system.out.println("源文数据="+message);
        system.out.println("解密数据=" + messagede);

        string bs=messagede.split("@=@")[1];
        system.out.println(bs);
    }
    /**
     * 随机生成密钥对
     * @throws nosuchalgorithmexception
     */
    public static void genkeypair() throws nosuchalgorithmexception {
        // keypairgenerator类用于生成公钥和私钥对,基于rsa算法生成对象
        keypairgenerator keypairgen = keypairgenerator.getinstance("rsa");
        // 初始化密钥对生成器,密钥大小为96-1024位
        keypairgen.initialize(1024,new securerandom());
        // 生成一个密钥对,保存在keypair中
        keypair keypair = keypairgen.generatekeypair();
        // 得到私钥
        rsaprivatekey privatekey = (rsaprivatekey) keypair.getprivate();
        // 得到公钥
        rsapublickey publickey = (rsapublickey) keypair.getpublic();

        string publickeystring = new string(base64.encodebase64(publickey.getencoded()));
        system.out.println("公钥="+publickeystring);
        // 得到私钥字符串
        string privatekeystring = new string(base64.encodebase64((privatekey.getencoded())));
        system.out.println("私钥="+privatekeystring);
        // 将公钥和私钥保存到map
        //0表示公钥
        keymap.put(0,publickeystring);
        //1表示私钥
        keymap.put(1,privatekeystring);
    }
    /**
     * rsa公钥加密
     *
     * @param str
     *            加密字符串
     * @param publickey
     *            公钥
     * @return 密文
     * @throws exception
     *             加密过程中的异常信息
     */
    public static string encrypt( string str, string publickey ) throws exception{
        //base64编码的公钥
        byte[] decoded = base64.decodebase64(publickey);
        rsapublickey pubkey = (rsapublickey) keyfactory.getinstance("rsa").generatepublic(new x509encodedkeyspec(decoded));
        //rsa加密
        cipher cipher = cipher.getinstance("rsa");
        cipher.init(cipher.encrypt_mode, pubkey);
        string outstr = base64.encodebase64string(cipher.dofinal(str.getbytes("utf-8")));
        return outstr;
    }
    /**
     * rsa私钥解密
     *
     * @param str
     *            加密字符串
     * @param privatekey
     *            私钥
     * @return 铭文
     * @throws exception
     *             解密过程中的异常信息
     */
    public static string decrypt(string str, string privatekey) throws exception{
        //64位解码加密后的字符串
        byte[] inputbyte = base64.decodebase64(str.getbytes("utf-8"));
        //base64编码的私钥
        byte[] decoded = base64.decodebase64(privatekey);
        rsaprivatekey prikey = (rsaprivatekey) keyfactory.getinstance("rsa").generateprivate(new pkcs8encodedkeyspec(decoded));
        //rsa解密
        cipher cipher = cipher.getinstance("rsa");
        cipher.init(cipher.decrypt_mode, prikey);
        string outstr = new string(cipher.dofinal(inputbyte));
        return outstr;
    }
}