Java利用MD5WithRSA簽名及DESede加密


前言:近期公司做數據加密及簽名,整理如下:

一、數字簽名。

是只有信息的發送者才能產生的別人無法偽造的一段數字串,具有不可抵賴性,可驗證信息完整性的一種手段。

簽名不可偽造:其他人因為沒有對應的私鑰,所以沒法生成公鑰可以解密的密文,所以是不可偽造的。

過程為:

1.A對消息M計算摘要,得到摘要H(可以采用MD5,因為MD5具有唯一性且不可逆)。

2.A利用自己的私鑰對H進行簽名得到Sign(即加密,可以采用RSA)

二、消息加密

可采用DESede算法進行加密,需要獲取密鑰對。

三、消息加密,並進行簽名

1.A生成消息M。

2.利用MD5加密M生成摘要H(就是生成16字節的散列值)。

3.利用A的私鑰(因為私鑰保護的好是不可能外露的,加密后的消息是不可能被其他公鑰解密的)對H進行加密,生成簽名Sign。

4.將M通過DESede進行加密,生成加密消息R。

5.將Sign和R進行Base64編碼后發送給B。

四、解密

1.解密消息R,生成原文P。

2.利用A的公鑰解密簽名Sign生成B。

3.對P進行MD5加密,並與B進行比較,如果一致說明沒有被修改過。

五、代碼(以下代碼已驗證)

import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import kh.pms.tools.StringUtil;

/**
 * 簽名驗簽及加密 1.對原文進行des加密。 2.des加密數據進行md5。 3.用我方私鑰進行md5的簽名。 4.用我方公鑰對des加密數據進行加密
 * 
 * @author chx
 *
 */
public class MD5withRSA {
    private static final String FLAG_RSA = "RSA";
    private static final String SIGNATURE_ALGORITHM = "MD5withRSA";
    /**
     * 我方私鑰對象
     */
    private PrivateKey myPrivateKeyObj;

    /**
     * 銀行方公鑰對象
     */
    private PublicKey bankPublicKeyObj;

    /**
     * 獲取簽名
     * 
     * @return
     * @throws Exception
     */
    public byte[] getSign(String str) throws Exception {
        Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);// 簽名的算法
        signature.initSign(myPrivateKeyObj);
        signature.update(str.getBytes());
        return signature.sign();
    }

    /**
     * 析構函數
     * 
     * @param plain
     *            待加解密原文
     * @throws Exception
     */
    public MD5withRSA() throws Exception {
        myPrivateKeyObj = getPrivateKey();
      //將此處的JianHangUtil.bankPublicKey更換為自己的公鑰字符串(base64格式),后面的 bankPublicKeyObj
= getPublicKey(JianHangUtil.bankPublicKey); } /** * 通過預制公鑰生成PublicKey * * @param pubKey * @return * @throws Exception */ private PublicKey getPublicKey(String key) throws Exception { byte[] encoded = StringUtil.getBaseStrJie(key); X509EncodedKeySpec keySpec = new X509EncodedKeySpec(encoded); KeyFactory factory = KeyFactory.getInstance(FLAG_RSA); return factory.generatePublic(keySpec); } /** * 將指定的字符串轉換為私鑰key * * @param priKey * @return * @throws Exception */ private PrivateKey getPrivateKey() throws Exception { // 首先進行base64解碼。 byte[] encoded = StringUtil.getBaseStrJie(JianHangUtil.myPrivateKey); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encoded); KeyFactory factory = KeyFactory.getInstance(FLAG_RSA); return factory.generatePrivate(keySpec); } /** * 驗證簽名 * * @param data * 原文 * @param mySign * 簽名 * @return * @throws Exception */ public boolean yanZhengSign(byte[] data, byte[] mySign) throws Exception { Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); signature.initVerify(bankPublicKeyObj); signature.update(data); return signature.verify(mySign); }

 

加解密:

package kh.pms.bank;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import kh.pms.tools.StringUtil;

/**
 * 報文加解密工具(注意,本類所有方法均會進行base64解碼)
 * 
 * @author chx
 *
 */
public class DESedeCoder {
    /**
     * 密鑰算法
     */
    private static String KEY_ALGORITHM = "DESede";
    private static String DEFAULT_CIPHER_ALGORITHM = "DESede/ECB/PKCS5Padding";

    /**
     * 加密(會對des和公鑰進行base64解碼)
     * 
     * @param data
     *            待加密數據
     * @param key
     *            密鑰
     * @return byte[] 加密數據
     * @throws Exception
     */
    public byte[] encrypt(byte[] src) throws Exception {
        DESedeKeySpec dks = new DESedeKeySpec(StringUtil.getBaseStrJie(JianHangUtil.desKey));
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(KEY_ALGORITHM);
        SecretKey securekey = keyFactory.generateSecret(dks);
        Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, securekey);
        return cipher.doFinal(src);
    }

    /**
     * 解密
     * 
     * @param data
     *            待解密數據
     * @param key
     *            密鑰
     * @return byte[] 解密數據
     * @throws Exception
     */
    public byte[] decrypt(byte[] data) throws Exception {
        // 加解密的deskey(需更換為自己的des密鑰)
        DESedeKeySpec dks = new DESedeKeySpec(StringUtil.getBaseStrJie(JianHangUtil.desKey));
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(KEY_ALGORITHM);
        SecretKey securekey = keyFactory.generateSecret(dks);
        Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, securekey);
        return cipher.doFinal(data);
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM