亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? crsa.java

?? 說明: 1、里面有什么: 1.1、org.bouncycastle.*下的所有軟件是bouncycastle組織開發的軟件包 1.2、org.infosecurity.*下的軟件包括
?? JAVA
?? 第 1 頁 / 共 2 頁
字號:
package org.infosecurity.cryptography;

/**
 * <p>Title: RSA算法的軟件實現 </p>
 * <p>Description: RSA算法的軟件實現,功能包括:公鑰加密私鑰解密</p>
 * <p>數字簽名和簽名驗證,密鑰對(公私鑰)的生成,遵循PKCS標準</p>
 * <p>Copyright: Copyright (c) 2003</p>
 * <p>Company: 中信信息安全組織(CISO)</p>
 * @author 張榮華
 * @version 1.0.2003.0704
 */

import java.io.*;
import java.math.*;
import java.util.*;
import java.security.SecureRandom;
import org.bouncycastle.asn1.*;
import org.bouncycastle.asn1.x509.*;
import org.bouncycastle.util.encoders.*;

public class CRsa extends Object implements Serializable {
    // HASH算法的缺省摘要的信息
    private final static byte[] SHA1_DIGEST_INFO = {
        (byte)0x30, (byte)0x21, (byte)0x30, (byte)0x09, (byte)0x06,
        (byte)0x05, (byte)0x2b, (byte)0x0e, (byte)0x03, (byte)0x02,
        (byte)0x1a, (byte)0x05, (byte)0x00, (byte)0x04, (byte)0x14,
        (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
        (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
        (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
        (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00
    };

    private final static byte[] MD5_DIGEST_INFO = {
        (byte)0x30, (byte)0x20, (byte)0x30, (byte)0x0c, (byte)0x06,
        (byte)0x08, (byte)0x2a, (byte)0x86, (byte)0x48, (byte)0x86,
        (byte)0xf7, (byte)0x0d, (byte)0x02, (byte)0x05, (byte)0x05,
        (byte)0x00, (byte)0x04, (byte)0x10, (byte)0x00, (byte)0x00,
        (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
        (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
        (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00
	};
    private byte[] mTDefault=null;
    private int    mLen=0;
    //
    private SecureRandom secureRd=new SecureRandom();
    private static BigInteger ONE = BigInteger.valueOf(1);
    private static BigInteger TWO = BigInteger.valueOf(2);
    // ebase為17
    private static BigInteger eBase = BigInteger.valueOf(0x11);
    RSAPublicKey pukParam=null;
    RSAPrivateKey pvkParam=null;

    public CRsa() {

    }
    /**
     *   設置公鑰
     */
    public void setPublicKey(RSAPublicKey puk)
    {
        this.pukParam = puk;
    }
    /**
     *   設置私鑰
     */
    public void setPrivateKey(RSAPrivateKey pvk)
    {
        this.pvkParam = pvk;
        this.pukParam = new RSAPublicKey(pvk.getModulus(),pvk.getExponent());
    }
    /**
     *   公鑰加密
     */
    public byte[] PublicKeyEncrypt(byte[] indata,int indatalen)
            throws DataLengthException
    {
        int k=getInputBlockSize(true);
        byte EncryptBlock[]=null;
        // PS依據輸入數據的長度>8
        if (indatalen > getInputBlockSize(true)-10)
        {
            throw new DataLengthException("輸入RSA加密的數據太長.\n");
        }
        ByteArrayOutputStream baos=new ByteArrayOutputStream();
        byte[] PS=new byte[(getOutputBlockSize(true)-indatalen-2)];
        for(int i=0;i<PS.length;i++)
        {
            PS[i]=(byte)(secureRd.nextInt(255)+1);
        }
        try
        {
            baos.write((byte)0x02);
            baos.write(PS);
            baos.write((byte)0x00);
            baos.write(indata);
        }catch(IOException ioe){
            ioe.printStackTrace();
        }
        EncryptBlock=baos.toByteArray();
        BigInteger  input = new BigInteger(1, EncryptBlock);
        byte[]      output=null;
        output = input.modPow(pukParam.getExponent(), pukParam.getModulus()).toByteArray();
        if (output[0] == 0 && output.length > getOutputBlockSize(true))//比輸出長度長,截斷
        {
            byte[]  tmp = new byte[output.length - 1];
            System.arraycopy(output, 1, tmp, 0, tmp.length);
            return tmp;
        }
        if (output.length < getOutputBlockSize(true))                 // 比輸出長度短,增長
        {
            byte[]  tmp = new byte[getOutputBlockSize(true)];
            System.arraycopy(output, 0, tmp, tmp.length - output.length, output.length);
            return tmp;
        }
        return output;
    }
    /**
     *   私鑰解密
     */
    public byte[] PrivateKeyDecrypt(byte[] indata,int indatalen)
            throws DataLengthException
    {
        int padLength=0;
        if (indatalen > getInputBlockSize(false))
        {
            throw new DataLengthException("輸入RSA解密的數據太長.");
        }
        byte[]      output=null;
        BigInteger input=new BigInteger(1,indata);
        output = input.modPow(pvkParam.getPrivateExponent(), pukParam.getModulus()).toByteArray();
        if(output.length<10)
            throw new DataLengthException("消息格式不對.");
        if(output[0]!=(byte)0x02)
        {
            throw new DataLengthException("不是公鑰操作的結果");
        }
        int start=0;
        int outLen=output.length;
        while(output[start]!=(byte)0x00)
        {
            start++;
            if(start>=outLen)
                throw new DataLengthException("無效的填充數據!");
        }
        start++;          // 跳過0
        byte tm[]=new byte[outLen-start];
        try {
            System.arraycopy(output,start,tm,0,tm.length);
        }
        catch (Exception ex) {
            return null;
        }
        return tm;
    }
    /**
     * 數字簽名
     * @param HashAlgorith 散列算法(5--md5 3--sha1)
     * @param indata       輸入數據
     */
    public byte[] signData(int HashAlgorithm,byte[] indata)
            throws Exception
    {
        int indatalen=indata.length;
        byte[] hashRes=null;
        int blockLen=getInputBlockSize(true);
        if(HashAlgorithm==5)
            hashRes=new byte[16];
        else if(HashAlgorithm==3)
            hashRes=new byte[20];
        else
            throw new Exception("不支持的散列算法!");
        if(indata==null||indata.length==0)
            throw new Exception("輸入數據為空");
        if(HashAlgorithm==5)
        {
            // 生成摘要
            mTDefault=new byte[MD5_DIGEST_INFO.length];
            mLen=16;
            System.arraycopy(MD5_DIGEST_INFO,0,mTDefault,0,mTDefault.length);
            CMd5 md5=new CMd5();
            for(int i=0;i<indatalen;i++)
                md5.update(indata[i]);
            md5.doFinal(hashRes,0);
            // 摘要編碼
            // 待編碼的長度要比密鑰的長度小1
            byte inbyte[]=encode(hashRes,getOutputBlockSize(true)-1,16);
            // 簽名
            byte[]      signData=null;
            BigInteger input=new BigInteger(1,inbyte);
            signData = input.modPow(pvkParam.getPrivateExponent(), pukParam.getModulus()).toByteArray();
            // 如果是正數轉成一個字節數組,我們將得到一個以0開頭的結果
            if (signData[0] == 0 && signData.length > getOutputBlockSize(true))//比輸出長度長,截斷
            {
                byte[]  tmp = new byte[signData.length - 1];
                System.arraycopy(signData, 1, tmp, 0, tmp.length);
                return tmp;
            }
            if (signData.length < getOutputBlockSize(true))                 // 比輸出長度短,增長
            {
                byte[]  tmp = new byte[getOutputBlockSize(true)];
                System.arraycopy(signData, 0, tmp, tmp.length - signData.length, signData.length);
                return tmp;
            }
            return signData;
        }
        if(HashAlgorithm==3)
        {
            mTDefault=new byte[SHA1_DIGEST_INFO.length];
            mLen=20;
            System.arraycopy(SHA1_DIGEST_INFO,0,mTDefault,0,mTDefault.length);
            CSha1 sha1=new CSha1();
            for(int i=0;i<indatalen;i++)
                sha1.update(indata[i]);
            sha1.doFinal(hashRes,0);
            // 摘要編碼
             byte inbyte[]=encode(hashRes,getOutputBlockSize(true)-1,20);
             // 簽名
             byte[]      signData=null;
             BigInteger input=new BigInteger(1,inbyte);
             signData = input.modPow(pvkParam.getPrivateExponent(), pukParam.getModulus()).toByteArray();
             if (signData[0] == 0 && signData.length > getOutputBlockSize(true))//比輸出長度長,截斷
             {
                 byte[]  tmp = new byte[signData.length - 1];
                 System.arraycopy(signData, 1, tmp, 0, tmp.length);
                 return tmp;
             }
             if (signData.length < getOutputBlockSize(true))                 // 比輸出長度短,增長
             {
                 byte[]  tmp = new byte[getOutputBlockSize(true)];
                 System.arraycopy(signData, 0, tmp, tmp.length - signData.length, signData.length);
                 return tmp;
             }
             return signData;
        }
        return null;
    }
    /**
     *   驗證數字簽名
     */
    public int verifySignData(byte[] indata,byte[] plainData)throws Exception
    {
        try {
            if(indata.length>getInputBlockSize(false))
                throw new Exception("簽名的輸入長度過長!");
            BigInteger input=new BigInteger(1,indata);
            byte[] out = input.modPow(pukParam.getExponent(), pukParam.getModulus()).toByteArray();
            byte[] bEncodedHash=decode(out);
            ByteArrayInputStream bIn=null;
            bIn = new ByteArrayInputStream(bEncodedHash);
            DERInputStream dIn = new DERInputStream(bIn);
            ASN1Sequence   seq = (ASN1Sequence)dIn.readObject();
            if(seq.size()==2)
            {
                DigestInfo digestInf=DigestInfo.getInstance(seq);
                AlgorithmIdentifier aID=digestInf.getAlgorithmId();
                if(aID.getObjectId().getId().equals("1.2.840.113549.2.5"))//MD5
                {
                    // 生成摘要
                    int plainDataLength=0;
                    plainDataLength=plainData.length;
                    byte[] plainHash=new byte[16];
                    CMd5 md5=new CMd5();
                    for(int i=0;i<plainDataLength;i++)
                        md5.update(plainData[i]);
                    md5.doFinal(plainHash,0);
                    byte[] digest=digestInf.getDigest();
                   for(int i=0;i<md5.getDigestSize();i++)
                   {
                       //System.out.println("result="+digest[i]+"plain="+plainHash[i]);
                       if(digest[i]==plainHash[i])
                       {
                           //調試輸出語句
                           continue;
                       }
                       else
                           return 0;
                   }
                   return 1;
                }
                else if(aID.getObjectId().getId().equals("1.3.14.3.2.26"))
                {
                    // 生成摘要
                    int plainDataLength=0;
                    plainDataLength=plainData.length;
                    byte[] plainHash=new byte[20];
                    CSha1 sha1=new CSha1();
                    for(int i=0;i<plainDataLength;i++)
                        sha1.update(plainData[i]);
                    sha1.doFinal(plainHash,0);
                    byte[] digest=digestInf.getDigest();
                   for(int i=0;i<sha1.getDigestSize();i++)
                   {
                       if(digest[i]==plainHash[i])
                           continue;
                       else
                           return 0;
                   }
                   return 1;
                }
                else
                {
                   // 目前不支持該算法
                    return 0;
                }
            }
            else
                return 0;
        }
        catch (Exception e) {

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人av网站在线观看| 欧美军同video69gay| 欧美私人免费视频| 国产三级一区二区| 日韩二区在线观看| 欧美亚洲动漫精品| 69堂国产成人免费视频| 国产欧美日韩视频在线观看| 日韩成人精品在线| 91麻豆高清视频| 国产亚洲精品bt天堂精选| 午夜精品久久久久| 在线看不卡av| 亚洲蜜臀av乱码久久精品蜜桃| 国产一区二区导航在线播放| 91精品久久久久久久久99蜜臂| 一区av在线播放| 91丝袜美女网| 亚洲精品你懂的| 99久久综合色| 成人免费在线视频观看| 国产91在线看| 中文成人av在线| 国产69精品久久久久毛片 | 国产日韩一级二级三级| 久久er99热精品一区二区| 欧美区视频在线观看| 亚洲午夜一区二区三区| 欧美无人高清视频在线观看| 伊人开心综合网| 在线视频一区二区三区| 亚洲三级在线看| 91亚洲永久精品| 亚洲三级电影网站| 91麻豆国产福利精品| 亚洲欧美日韩国产综合| 色菇凉天天综合网| 亚洲一区二区三区视频在线| 欧美色大人视频| 视频在线在亚洲| 欧美一区二区三区免费大片 | 欧美美女网站色| 丝袜国产日韩另类美女| 国产精品久久久久久亚洲毛片| 免费观看日韩av| 久久精品亚洲乱码伦伦中文| 丁香婷婷综合网| 亚洲久草在线视频| 欧美日韩一区小说| 青青草91视频| 国产亚洲欧美日韩在线一区| 成人午夜激情影院| 一区二区在线观看免费| 777午夜精品免费视频| 久久不见久久见免费视频7| 国产婷婷色一区二区三区在线| 不卡一区二区三区四区| 亚洲大片在线观看| 久久久久久久久久久久电影 | 免费人成精品欧美精品| 久久久亚洲精华液精华液精华液 | 亚洲欧美日韩中文字幕一区二区三区| 在线观看视频一区| 国产资源精品在线观看| 亚洲色大成网站www久久九九| 9191成人精品久久| 不卡一区二区在线| 美女一区二区视频| 夜夜精品浪潮av一区二区三区| 欧美一区二区三区公司| jlzzjlzz国产精品久久| 五月婷婷激情综合网| 久久久不卡网国产精品一区| 日本久久一区二区三区| 国产原创一区二区| 亚州成人在线电影| 亚洲国产成人一区二区三区| 7777女厕盗摄久久久| 懂色av中文字幕一区二区三区| 亚洲小说欧美激情另类| 中文字幕乱码久久午夜不卡| 制服丝袜中文字幕一区| 99久久免费精品高清特色大片| 日本欧美大码aⅴ在线播放| 中文字幕亚洲一区二区va在线| 欧美xingq一区二区| 欧美自拍偷拍一区| 97久久精品人人爽人人爽蜜臀| 精品写真视频在线观看| 亚洲一区二区三区中文字幕在线| 国产日韩v精品一区二区| 日韩一级片在线观看| 91国偷自产一区二区三区成为亚洲经典| 久久se这里有精品| 日韩av电影一区| 亚洲国产视频直播| 亚洲激情一二三区| 亚洲欧美在线高清| 国产精品嫩草久久久久| 国产亚洲一区二区三区| 精品日韩欧美一区二区| 欧美一区二区三级| 欧美人妇做爰xxxⅹ性高电影| 94-欧美-setu| 99re成人在线| 色综合久久综合网97色综合| 成人永久免费视频| 成人免费看黄yyy456| 国产精品一卡二卡在线观看| 国产一区在线观看视频| 久久精品国产99国产精品| 奇米综合一区二区三区精品视频| 日韩电影在线观看电影| 日本欧美一区二区| 久久精品国产免费| 狠狠色狠狠色综合系列| 欧美精品vⅰdeose4hd| 国产精品一区二区在线播放| 久久91精品久久久久久秒播| 久久99国产精品免费网站| 久久成人18免费观看| 国产中文字幕一区| 成人激情免费视频| 9久草视频在线视频精品| 91香蕉视频黄| 精品婷婷伊人一区三区三| 欧美日韩精品是欧美日韩精品| 欧美精品久久99| 欧美大黄免费观看| 国产视频视频一区| 亚洲日本va午夜在线影院| 亚洲愉拍自拍另类高清精品| 日韩精品国产精品| 国产乱一区二区| 97精品电影院| 欧美精品视频www在线观看| 精品国产乱码久久久久久影片| 久久久九九九九| 亚洲乱码国产乱码精品精98午夜| 亚洲一区二区在线免费看| 久久成人综合网| 97se亚洲国产综合自在线| 欧美日产在线观看| 国产午夜精品一区二区| 一区二区三区在线观看网站| 日本成人在线网站| 成人免费高清视频| 欧美日韩在线播放一区| 久久久久综合网| 一区二区三区91| 国产一区二区三区观看| 91丨porny丨国产入口| 日韩欧美资源站| 亚洲你懂的在线视频| 另类小说色综合网站| 99精品视频一区| 精品国产乱码久久久久久浪潮 | www.欧美色图| 91精品国产综合久久精品性色| 中文字幕精品三区| 狂野欧美性猛交blacked| 99久久国产综合色|国产精品| 91精品国产入口| 亚洲欧美日韩在线| 国产精品一二三| 欧美一级黄色片| 亚洲最新视频在线观看| 国产精品一区二区无线| 91超碰这里只有精品国产| 亚洲精品水蜜桃| 成+人+亚洲+综合天堂| 精品久久久三级丝袜| 视频精品一区二区| 在线一区二区三区四区| 中文欧美字幕免费| 精一区二区三区| 91精品国产91热久久久做人人| 亚洲精品高清视频在线观看| 成人免费视频视频在线观看免费| 日韩欧美成人激情| 日本 国产 欧美色综合| 欧美天堂一区二区三区| 1区2区3区精品视频| 福利视频网站一区二区三区| 精品精品欲导航| 美女免费视频一区二区| 欧美人与z0zoxxxx视频| 亚洲成人动漫在线免费观看| 在线一区二区视频| 亚洲免费观看视频| 91在线无精精品入口| 欧美国产日韩a欧美在线观看 | 日韩和欧美的一区| 欧美在线观看视频一区二区三区 | 91精品福利视频| 亚洲视频免费看| 色综合天天天天做夜夜夜夜做| 中文一区二区在线观看| 粉嫩高潮美女一区二区三区| 国产亚洲一区二区在线观看|