<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    801 WORKPLACE

    追尋夢(mèng)想,自由生活

    BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
      10 Posts :: 1 Stories :: 1 Comments :: 0 Trackbacks
    最初是下載了一個(gè)寫好了的Java版SHA1,代碼如下:

    來(lái)源:http://blog.csdn.net/zyg158/archive/2007/06/26/1667531.aspx

      1public class SHA1 {
      2    private final int[] abcde = {
      3            0x674523010xefcdab890x98badcfe0x103254760xc3d2e1f0
      4        }
    ;
      5    // 摘要數(shù)據(jù)存儲(chǔ)數(shù)組
      6    private int[] digestInt = new int[5];
      7    // 計(jì)算過(guò)程中的臨時(shí)數(shù)據(jù)存儲(chǔ)數(shù)組
      8    private int[] tmpData = new int[80];
      9    // 計(jì)算sha-1摘要
     10    private int process_input_bytes(byte[] bytedata) {
     11        // 初試化常量
     12        System.arraycopy(abcde, 0, digestInt, 0, abcde.length);
     13        // 格式化輸入字節(jié)數(shù)組,補(bǔ)10及長(zhǎng)度數(shù)據(jù)
     14        byte[] newbyte = byteArrayFormatData(bytedata);
     15        // 獲取數(shù)據(jù)摘要計(jì)算的數(shù)據(jù)單元個(gè)數(shù)
     16        int MCount = newbyte.length / 64;
     17        // 循環(huán)對(duì)每個(gè)數(shù)據(jù)單元進(jìn)行摘要計(jì)算
     18        for (int pos = 0; pos < MCount; pos++{
     19            // 將每個(gè)單元的數(shù)據(jù)轉(zhuǎn)換成16個(gè)整型數(shù)據(jù),并保存到tmpData的前16個(gè)數(shù)組元素中
     20            for (int j = 0; j < 16; j++{
     21                tmpData[j] = byteArrayToInt(newbyte, (pos * 64+ (j * 4));
     22            }

     23            // 摘要計(jì)算函數(shù)
     24            encrypt();
     25        }

     26        return 20;
     27    }

     28    // 格式化輸入字節(jié)數(shù)組格式
     29    private byte[] byteArrayFormatData(byte[] bytedata) {
     30        // 補(bǔ)0數(shù)量
     31        int zeros = 0;
     32        // 補(bǔ)位后總位數(shù)
     33        int size = 0;
     34        // 原始數(shù)據(jù)長(zhǎng)度
     35        int n = bytedata.length;
     36        // 模64后的剩余位數(shù)
     37        int m = n % 64;
     38        // 計(jì)算添加0的個(gè)數(shù)以及添加10后的總長(zhǎng)度
     39        if (m < 56{
     40            zeros = 55 - m;
     41            size = n - m + 64;
     42        }
     else if (m == 56{
     43            zeros = 63;
     44            size = n + 8 + 64;
     45        }
     else {
     46            zeros = 63 - m + 56;
     47            size = (n + 64- m + 64;
     48        }

     49        // 補(bǔ)位后生成的新數(shù)組內(nèi)容
     50        byte[] newbyte = new byte[size];
     51        // 復(fù)制數(shù)組的前面部分
     52        System.arraycopy(bytedata, 0, newbyte, 0, n);
     53        // 獲得數(shù)組Append數(shù)據(jù)元素的位置
     54        int l = n;
     55        // 補(bǔ)1操作
     56        newbyte[l++= (byte0x80;
     57        // 補(bǔ)0操作
     58        for (int i = 0; i < zeros; i++{
     59            newbyte[l++= (byte0x00;
     60        }

     61        // 計(jì)算數(shù)據(jù)長(zhǎng)度,補(bǔ)數(shù)據(jù)長(zhǎng)度位共8字節(jié),長(zhǎng)整型
     62        long N = (long) n * 8;
     63        byte h8 = (byte) (N & 0xFF);
     64        byte h7 = (byte) ((N >> 8& 0xFF);
     65        byte h6 = (byte) ((N >> 16& 0xFF);
     66        byte h5 = (byte) ((N >> 24& 0xFF);
     67        byte h4 = (byte) ((N >> 32& 0xFF);
     68        byte h3 = (byte) ((N >> 40& 0xFF);
     69        byte h2 = (byte) ((N >> 48& 0xFF);
     70        byte h1 = (byte) (N >> 56);
     71        newbyte[l++= h1;
     72        newbyte[l++= h2;
     73        newbyte[l++= h3;
     74        newbyte[l++= h4;
     75        newbyte[l++= h5;
     76        newbyte[l++= h6;
     77        newbyte[l++= h7;
     78        newbyte[l++= h8;
     79        return newbyte;
     80    }

     81    private int f1(int x, int y, int z) {
     82        return (x & y) | (~& z);
     83    }

     84    private int f2(int x, int y, int z) {
     85        return x ^ y ^ z;
     86    }

     87    private int f3(int x, int y, int z) {
     88        return (x & y) | (x & z) | (y & z);
     89    }

     90    private int f4(int x, int y) {
     91        return (x << y) | x >>> (32 - y);
     92    }

     93    // 單元摘要計(jì)算函數(shù)
     94    private void encrypt() {
     95        for (int i = 16; i <= 79; i++{
     96            tmpData[i] = f4(tmpData[i - 3^ tmpData[i - 8^ tmpData[i - 14^
     97                    tmpData[i - 16], 1);
     98        }

     99        int[] tmpabcde = new int[5];
    100        for (int i1 = 0; i1 < tmpabcde.length; i1++{
    101            tmpabcde[i1] = digestInt[i1];
    102        }

    103        for (int j = 0; j <= 19; j++{
    104            int tmp = f4(tmpabcde[0], 5+
    105                f1(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4+
    106                tmpData[j] + 0x5a827999;
    107            tmpabcde[4= tmpabcde[3];
    108            tmpabcde[3= tmpabcde[2];
    109            tmpabcde[2= f4(tmpabcde[1], 30);
    110            tmpabcde[1= tmpabcde[0];
    111            tmpabcde[0= tmp;
    112        }

    113        for (int k = 20; k <= 39; k++{
    114            int tmp = f4(tmpabcde[0], 5+
    115                f2(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4+
    116                tmpData[k] + 0x6ed9eba1;
    117            tmpabcde[4= tmpabcde[3];
    118            tmpabcde[3= tmpabcde[2];
    119            tmpabcde[2= f4(tmpabcde[1], 30);
    120            tmpabcde[1= tmpabcde[0];
    121            tmpabcde[0= tmp;
    122        }

    123        for (int l = 40; l <= 59; l++{
    124            int tmp = f4(tmpabcde[0], 5+
    125                f3(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4+
    126                tmpData[l] + 0x8f1bbcdc;
    127            tmpabcde[4= tmpabcde[3];
    128            tmpabcde[3= tmpabcde[2];
    129            tmpabcde[2= f4(tmpabcde[1], 30);
    130            tmpabcde[1= tmpabcde[0];
    131            tmpabcde[0= tmp;
    132        }

    133        for (int m = 60; m <= 79; m++{
    134            int tmp = f4(tmpabcde[0], 5+
    135                f2(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4+
    136                tmpData[m] + 0xca62c1d6;
    137            tmpabcde[4= tmpabcde[3];
    138            tmpabcde[3= tmpabcde[2];
    139            tmpabcde[2= f4(tmpabcde[1], 30);
    140            tmpabcde[1= tmpabcde[0];
    141            tmpabcde[0= tmp;
    142        }

    143        for (int i2 = 0; i2 < tmpabcde.length; i2++{
    144            digestInt[i2] = digestInt[i2] + tmpabcde[i2];
    145        }

    146        for (int n = 0; n < tmpData.length; n++{
    147            tmpData[n] = 0;
    148        }

    149    }

    150    // 4字節(jié)數(shù)組轉(zhuǎn)換為整數(shù)
    151    private int byteArrayToInt(byte[] bytedata, int i) {
    152        return ((bytedata[i] & 0xff<< 24| ((bytedata[i + 1& 0xff<< 16|
    153        ((bytedata[i + 2& 0xff<< 8| (bytedata[i + 3& 0xff);
    154    }

    155    // 整數(shù)轉(zhuǎn)換為4字節(jié)數(shù)組
    156    private void intToByteArray(int intValue, byte[] byteData, int i) {
    157        byteData[i] = (byte) (intValue >>> 24);
    158        byteData[i + 1= (byte) (intValue >>> 16);
    159        byteData[i + 2= (byte) (intValue >>> 8);
    160        byteData[i + 3= (byte) intValue;
    161    }

    162    // 將字節(jié)轉(zhuǎn)換為十六進(jìn)制字符串
    163    private static String byteToHexString(byte ib) {
    164        char[] Digit = {
    165                '0''1''2''3''4''5''6''7''8''9''A''B''C',
    166                'D''E''F'
    167            }
    ;
    168        char[] ob = new char[2];
    169        ob[0= Digit[(ib >>> 4& 0X0F];
    170        ob[1= Digit[ib & 0X0F];
    171        String s = new String(ob);
    172        return s;
    173    }

    174    // 將字節(jié)數(shù)組轉(zhuǎn)換為十六進(jìn)制字符串
    175    private static String byteArrayToHexString(byte[] bytearray) {
    176        String strDigest = "";
    177        for (int i = 0; i < bytearray.length; i++{
    178            strDigest += byteToHexString(bytearray[i]);
    179        }

    180        return strDigest;
    181    }

    182    // 計(jì)算sha-1摘要,返回相應(yīng)的字節(jié)數(shù)組
    183    public byte[] getDigestOfBytes(byte[] byteData) {
    184        process_input_bytes(byteData);
    185        byte[] digest = new byte[20];
    186        for (int i = 0; i < digestInt.length; i++{
    187            intToByteArray(digestInt[i], digest, i * 4);
    188        }

    189        return digest;
    190    }

    191    // 計(jì)算sha-1摘要,返回相應(yīng)的十六進(jìn)制字符串
    192    public String getDigestOfString(byte[] byteData) {
    193        return byteArrayToHexString(getDigestOfBytes(byteData));
    194    }

    195    public static void main(String[] args) {
    196        String data = "1";
    197        System.out.println(data);
    198        String digest = new SHA1().getDigestOfString(data.getBytes());
    199        System.out.println(digest);
    200    }

    201}

    202

    在我們的一代令牌開(kāi)發(fā)中,我們通過(guò)修改其部分源代碼(重寫sha1及相應(yīng)的操作),實(shí)現(xiàn)otp在Android平臺(tái)上的實(shí)現(xiàn)。其實(shí)我的工作量并不大,只是按要求把代碼改了改,寫一個(gè)SHA1類,加入了三個(gè)函數(shù),包含初始化,數(shù)據(jù)更新,更新輸出。以修改源代碼中的過(guò)耦合現(xiàn)象,即digestInt數(shù)據(jù)不被隨便修改,將其初始化過(guò)程實(shí)現(xiàn)在初始化函數(shù)中。

    代碼如下:
    /**
    * SHA1類,主要包含encrypt,init,upData,doFinal函數(shù)
    @author Snowolf
    *
    */public class SHA1{    
        
    private final int[] abcde = {
                
    0x674523010xefcdab890x98badcfe0x103254760xc3d2e1f0
            };
    // 摘要數(shù)據(jù)存儲(chǔ)數(shù)組
        private int[] digestInt = new int[5];
      
    // 計(jì)算過(guò)程中的臨時(shí)數(shù)據(jù)存儲(chǔ)數(shù)組
           private int[] tmpData = new int[80];
        
    /**
         * f1是SHA1算法中的一系列函數(shù)中的一個(gè),操作32位字x,y,z并且產(chǎn)生32位字作為輸出
         * 
    @param x 32位字
         * 
    @param y 32位字
         * 
    @param z 32位字
         * 
    @return 運(yùn)算結(jié)果
         
    */
        
    private int f1(int x, int y, int z) {
            
    return (x & y) | (~& z);
        }
        
    /**
         * f2是SHA1算法中的一系列函數(shù)中的一個(gè),操作32位字x,y,z并且產(chǎn)生32位字作為輸出
         * 
    @param x 32位字
         * 
    @param y 32位字
         * 
    @param z 32位字
         * 
    @return 運(yùn)算結(jié)果
         
    */
        
    private int f2(int x, int y, int z) {
            
    return x ^ y ^ z;
        }
        
    /**
         * f3是SHA1算法中的一系列函數(shù)中的一個(gè),操作32位字x,y,z并且產(chǎn)生32位字作為輸出
         * 
    @param x 32位字
         * 
    @param y 32位字
         * 
    @param z 32位字
         * 
    @return 運(yùn)算結(jié)果
         
    */
        
    private int f3(int x, int y, int z) {
            
    return (x & y) | (x & z) | (y & z);
        }
        
    /**
         * f4是循環(huán)移位函數(shù),將x進(jìn)行循環(huán)移位,移位次數(shù)為y
         * 
    @param x 要移位的字
         * 
    @param y 移位次數(shù)
         * 
    @return 運(yùn)算結(jié)果
         
    */
        
    private int f4(int x, int y) {
            
    return (x << y) | x >>> (32 - y);
        }
        
    /**
         * 單元摘要計(jì)算函數(shù),函數(shù)運(yùn)算完成后,最終結(jié)果儲(chǔ)存在digestInt中
         * 
    @param Message_Block 為大小16個(gè)字的int型數(shù)組,即我們已經(jīng)格式化完成的,要進(jìn)行加密運(yùn)算的數(shù)據(jù)
         * 
    @return void
         * 
    @author Snowolf
         
    */
        
    private void encrypt(int[] Message_Block) {
            
    for(int t = 0; t < 16; t++)
            {
                tmpData[t] 
    = Message_Block[t];
            }
            
    for (int i = 16; i <= 79; i++) {
                tmpData[i] 
    = f4(tmpData[i - 3^ tmpData[i - 8^ tmpData[i - 14^
                        tmpData[i 
    - 16], 1);
            }
            
    int[] tmpabcde = new int[5];
            
    for (int i1 = 0; i1 < tmpabcde.length; i1++) {
                tmpabcde[i1] 
    = digestInt[i1]; 
            }
            
    for (int j = 0; j <= 19; j++) {
                
    int tmp = f4(tmpabcde[0], 5+
                    f1(tmpabcde[
    1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4+
                    tmpData[j] 
    + 0x5a827999;
                tmpabcde[
    4= tmpabcde[3];
                tmpabcde[
    3= tmpabcde[2];
                tmpabcde[
    2= f4(tmpabcde[1], 30);
                tmpabcde[
    1= tmpabcde[0];
                tmpabcde[
    0= tmp;
            }
            
    for (int k = 20; k <= 39; k++) {
                
    int tmp = f4(tmpabcde[0], 5+
                    f2(tmpabcde[
    1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4+
                    tmpData[k] 
    + 0x6ed9eba1;
                tmpabcde[
    4= tmpabcde[3];
                tmpabcde[
    3= tmpabcde[2];
                tmpabcde[
    2= f4(tmpabcde[1], 30);
                tmpabcde[
    1= tmpabcde[0];
                tmpabcde[
    0= tmp;
            }
            
    for (int l = 40; l <= 59; l++) {
                
    int tmp = f4(tmpabcde[0], 5+
                    f3(tmpabcde[
    1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4+
                    tmpData[l] 
    + 0x8f1bbcdc;
                tmpabcde[
    4= tmpabcde[3];
                tmpabcde[
    3= tmpabcde[2];
                tmpabcde[
    2= f4(tmpabcde[1], 30);
                tmpabcde[
    1= tmpabcde[0];
                tmpabcde[
    0= tmp;
            }
            
    for (int m = 60; m <= 79; m++) {
                
    int tmp = f4(tmpabcde[0], 5+
                    f2(tmpabcde[
    1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4+
                    tmpData[m] 
    + 0xca62c1d6;
                tmpabcde[
    4= tmpabcde[3];
                tmpabcde[
    3= tmpabcde[2];
                tmpabcde[
    2= f4(tmpabcde[1], 30);
                tmpabcde[
    1= tmpabcde[0];
                tmpabcde[
    0= tmp;
            }
            
    for (int i2 = 0; i2 < tmpabcde.length; i2++) {
                digestInt[i2] 
    = digestInt[i2] + tmpabcde[i2];//摘要存儲(chǔ)在digestInt
            }
            
    for (int n = 0; n < tmpData.length; n++) {
                tmpData[n] 
    = 0;
            }
        }
        
    /**
         * 初始化函數(shù),將digestInt值初始化為SHA1算法中的原始初值
         
    */
        
    public void init(){       
            System.arraycopy(abcde, 
    0, digestInt, 0, abcde.length);
        }
        
    /** SHA1加密運(yùn)算,其中updata返回值為void,此時(shí)digestInt中的數(shù)據(jù)為計(jì)算結(jié)果(摘要)
         *為16個(gè)字的int型數(shù)組,即我們已經(jīng)格式化完成的數(shù)據(jù)
         * 
    @param Message_Block 為大小16個(gè)字的int型數(shù)組,即我們已經(jīng)格式化完成的,要進(jìn)行加密運(yùn)算的數(shù)據(jù)
         * 
    @author Snowolf
         
    */
        
    public void upData(int[] Message_Block){
            encrypt(Message_Block);
        }
        
    /**
         * SHA1加密運(yùn)算,返回值為int[],即返回計(jì)算出來(lái)的摘要
         * 
    @param Message_Block 為大小16個(gè)字的int型數(shù)組,即我們已經(jīng)格式化完成的,要進(jìn)行加密運(yùn)算的數(shù)據(jù)
         * 
    @return int[5]摘要
         * 
    @author Snowolf
         
    */
        
    public int[] doFinal(int[] Message_Block){
            
    int[] doFinalInt = new int[5];
            encrypt(Message_Block);
            System.arraycopy(digestInt, 
    0, doFinalInt, 0, digestInt.length);
            
    return doFinalInt;
        }
    }



    代碼如下:

      1/**
      2* SHA1類,主要包含encrypt,init,upData,doFinal函數(shù)
      3@author Snowolf
      4*
      5*/

      6public class SHA1{    
      7    private final int[] abcde = {
      8            0x674523010xefcdab890x98badcfe0x103254760xc3d2e1f0
      9        }
    ;
     10// 摘要數(shù)據(jù)存儲(chǔ)數(shù)組
     11    private int[] digestInt = new int[5];
     12  // 計(jì)算過(guò)程中的臨時(shí)數(shù)據(jù)存儲(chǔ)數(shù)組
     13    
     14    private int[] tmpData = new int[80];
     15    /**
     16     * f1是SHA1算法中的一系列函數(shù)中的一個(gè),操作32位字x,y,z并且產(chǎn)生32位字作為輸出
     17     * @param x 32位字
     18     * @param y 32位字
     19     * @param z 32位字
     20     * @return 運(yùn)算結(jié)果
     21     */

     22    private int f1(int x, int y, int z) {
     23        return (x & y) | (~& z);
     24    }

     25    /**
     26     * f2是SHA1算法中的一系列函數(shù)中的一個(gè),操作32位字x,y,z并且產(chǎn)生32位字作為輸出
     27     * @param x 32位字
     28     * @param y 32位字
     29     * @param z 32位字
     30     * @return 運(yùn)算結(jié)果
     31     */

     32    private int f2(int x, int y, int z) {
     33        return x ^ y ^ z;
     34    }

     35    /**
     36     * f3是SHA1算法中的一系列函數(shù)中的一個(gè),操作32位字x,y,z并且產(chǎn)生32位字作為輸出
     37     * @param x 32位字
     38     * @param y 32位字
     39     * @param z 32位字
     40     * @return 運(yùn)算結(jié)果
     41     */

     42    private int f3(int x, int y, int z) {
     43        return (x & y) | (x & z) | (y & z);
     44    }

     45    /**
     46     * f4是循環(huán)移位函數(shù),將x進(jìn)行循環(huán)移位,移位次數(shù)為y
     47     * @param x 要移位的字
     48     * @param y 移位次數(shù)
     49     * @return 運(yùn)算結(jié)果
     50     */

     51    private int f4(int x, int y) {
     52        return (x << y) | x >>> (32 - y);
     53    }

     54    /**
     55     * 單元摘要計(jì)算函數(shù),函數(shù)運(yùn)算完成后,最終結(jié)果儲(chǔ)存在digestInt中
     56     * @param Message_Block 為大小16個(gè)字的int型數(shù)組,即我們已經(jīng)格式化完成的,要進(jìn)行加密運(yùn)算的數(shù)據(jù)
     57     * @return void
     58     * @author Snowolf
     59     */

     60    private void encrypt(int[] Message_Block) {
     61        for(int t = 0; t < 16; t++)
     62        {
     63            tmpData[t] = Message_Block[t];
     64        }

     65        for (int i = 16; i <= 79; i++{
     66            tmpData[i] = f4(tmpData[i - 3^ tmpData[i - 8^ tmpData[i - 14^
     67                    tmpData[i - 16], 1);
     68        }

     69        int[] tmpabcde = new int[5];
     70        for (int i1 = 0; i1 < tmpabcde.length; i1++{
     71            tmpabcde[i1] = digestInt[i1]; 
     72        }

     73        for (int j = 0; j <= 19; j++{
     74            int tmp = f4(tmpabcde[0], 5+
     75                f1(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4+
     76                tmpData[j] + 0x5a827999;
     77            tmpabcde[4= tmpabcde[3];
     78            tmpabcde[3= tmpabcde[2];
     79            tmpabcde[2= f4(tmpabcde[1], 30);
     80            tmpabcde[1= tmpabcde[0];
     81            tmpabcde[0= tmp;
     82        }

     83        for (int k = 20; k <= 39; k++{
     84            int tmp = f4(tmpabcde[0], 5+
     85                f2(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4+
     86                tmpData[k] + 0x6ed9eba1;
     87            tmpabcde[4= tmpabcde[3];
     88            tmpabcde[3= tmpabcde[2];
     89            tmpabcde[2= f4(tmpabcde[1], 30);
     90            tmpabcde[1= tmpabcde[0];
     91            tmpabcde[0= tmp;
     92        }

     93        for (int l = 40; l <= 59; l++{
     94            int tmp = f4(tmpabcde[0], 5+
     95                f3(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4+
     96                tmpData[l] + 0x8f1bbcdc;
     97            tmpabcde[4= tmpabcde[3];
     98            tmpabcde[3= tmpabcde[2];
     99            tmpabcde[2= f4(tmpabcde[1], 30);
    100            tmpabcde[1= tmpabcde[0];
    101            tmpabcde[0= tmp;
    102        }

    103        for (int m = 60; m <= 79; m++{
    104            int tmp = f4(tmpabcde[0], 5+
    105                f2(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4+
    106                tmpData[m] + 0xca62c1d6;
    107            tmpabcde[4= tmpabcde[3];
    108            tmpabcde[3= tmpabcde[2];
    109            tmpabcde[2= f4(tmpabcde[1], 30);
    110            tmpabcde[1= tmpabcde[0];
    111            tmpabcde[0= tmp;
    112        }

    113        for (int i2 = 0; i2 < tmpabcde.length; i2++{
    114            digestInt[i2] = digestInt[i2] + tmpabcde[i2];//摘要存儲(chǔ)在digestInt
    115        }

    116        for (int n = 0; n < tmpData.length; n++{
    117            tmpData[n] = 0;
    118        }

    119    }

    120    /**
    121     * 初始化函數(shù),將digestInt值初始化為SHA1算法中的原始初值
    122     */

    123    public void init(){       
    124        System.arraycopy(abcde, 0, digestInt, 0, abcde.length);
    125    }

    126    /** SHA1加密運(yùn)算,其中updata返回值為void,此時(shí)digestInt中的數(shù)據(jù)為計(jì)算結(jié)果(摘要)
    127     *為16個(gè)字的int型數(shù)組,即我們已經(jīng)格式化完成的數(shù)據(jù)
    128     * @param Message_Block 為大小16個(gè)字的int型數(shù)組,即我們已經(jīng)格式化完成的,要進(jìn)行加密運(yùn)算的數(shù)據(jù)
    129     * @author Snowolf
    130     */

    131    public void upData(int[] Message_Block){
    132        encrypt(Message_Block);
    133    }

    134    /**
    135     * SHA1加密運(yùn)算,返回值為int[],即返回計(jì)算出來(lái)的摘要
    136     * @param Message_Block 為大小16個(gè)字的int型數(shù)組,即我們已經(jīng)格式化完成的,要進(jìn)行加密運(yùn)算的數(shù)據(jù)
    137     * @return int[5]摘要
    138     * @author Snowolf
    139     */

    140    public int[] doFinal(int[] Message_Block){
    141        int[] doFinalInt = new int[5];
    142        encrypt(Message_Block);
    143        System.arraycopy(digestInt, 0, doFinalInt, 0, digestInt.length);
    144        return doFinalInt;
    145    }

    146}

    147
    posted on 2010-11-22 14:48 WangShishuai 閱讀(1122) 評(píng)論(1)  編輯  收藏 所屬分類: AndroidJava加密算法

    Feedback

    # re: SHA-1的Java實(shí)現(xiàn) 及在otp中的使用 2013-04-30 01:40 M.LI
    你好:我在讀你的http://www.tkk7.com/BigForest/archive/2010/11/22/338691.html
    這個(gè)文章,我是菜鳥想借鑒一下在OTP中的使用,但是我沒(méi)找到在里面 的用法,求指導(dǎo)……
    我 的郵箱hpucode@gmail.com  回復(fù)  更多評(píng)論
      


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 宅男666在线永久免费观看| 国产AV无码专区亚洲AV麻豆丫 | 亚洲va中文字幕无码| 亚洲av日韩综合一区久热| 成人免费福利电影| 在线亚洲午夜片AV大片| 国产卡一卡二卡三免费入口| 亚洲制服丝袜在线播放| 国产大片线上免费观看| 亚洲校园春色另类激情| 国产精品久久久久久久久久免费| 亚洲www77777| 日韩一级视频免费观看| 日本亚洲高清乱码中文在线观看| 免费人成年激情视频在线观看| 免费在线观看一区| 国外亚洲成AV人片在线观看| 国产在线观a免费观看| 亚洲av永久无码精品古装片| 一区二区三区观看免费中文视频在线播放| 亚洲Aⅴ无码专区在线观看q| 亚洲精品在线免费看| 色偷偷亚洲女人天堂观看欧| 国产精品深夜福利免费观看| 免费视频精品一区二区| 亚洲狠狠婷婷综合久久久久| 香蕉成人免费看片视频app下载| 久久久久亚洲AV无码网站| 中文毛片无遮挡高潮免费| 亚洲日韩一区二区一无码| 免费国产高清视频| j8又粗又长又硬又爽免费视频 | 免费污视频在线观看| 久久久无码精品亚洲日韩蜜臀浪潮| 中文毛片无遮挡高潮免费| 国产亚洲精品AAAA片APP| 亚洲天堂在线视频| 日本一区二区免费看| 亚洲成a人片在线看| 免费大学生国产在线观看p| 日韩a级无码免费视频|