20172329 2017-2018-2 《程序設計與數據結構》實驗三報告

20172329 2017-2018-2 《程序設計與數據結構》實驗三報告

課程:《程序設計與數據結構》
班級: 1723
姓名: 王文彬
學號:20172329
實驗教師:王志強
實驗日期:2018年5月10日
必修/選修: 必修php

1、實驗內容

(1)代碼規範html

  • 安裝alibaba 插件,解決代碼中的規範問題。
  • 在IDEA中使用工具(Code->Reformate Code)把下面代碼從新格式化
public class CodeStandard {
public static void main(String [] args){
StringBuffer buffer = new StringBuffer();
buffer.append('S');
buffer.append("tringBuffer");
System.out.println(buffer.charAt(1));
System.out.println(buffer.capacity());
System.out.println(buffer.indexOf("tring"));
System.out.println("buffer = " + buffer.toString());
if(buffer.capacity()<20)
buffer.append("1234567");
for(int i=0; i<buffer.length();i++)
System.out.println(buffer.charAt(i));
}
}

(2)協同測試java

  • 在碼雲上把本身的學習搭檔加入本身的項目中,確認搭檔的項目加入本身後,下載搭檔實驗二的Complex代碼,加入很多於三個JUnit單元測試用例,測試成功後git add .; git commit -m "本身學號 添加內容";git push;

(3)重構git

  • 學習並完成重構內容的練習,下載搭檔的代碼,至少進行三項重構。

(4)密碼學應用web

  • 以結對的方式完成Java密碼學相關內容的學習,結合重構。

2、 實驗過程及結果

1、第一個實驗:代碼規範
一、首先,咱們在設置裏面下載並安裝了alibaba 插件,開始了咱們規範代碼的道路。在剛剛裝好這個插件的時候,滿屏的規範異常,咱們就只得跟着步驟一步一步來;算法

/**
 *  CodeStandard class
 *
 * @author wwb
 * @date 2018/5/16
 */
public class CodeStandard  {
    public static void main(String [] args){
        StringBuffer buffer = new StringBuffer();
        final int maxCapacity=20;
        buffer.append('S');
        buffer.append("tringBuffer");
        System.out.println(buffer.charAt(1));
        System.out.println(buffer.capacity());
        System.out.println(buffer.indexOf("tring"));
        System.out.println("buffer = " + buffer.toString());
        /*if(buffer.capacity()<maxCapacity)
        {
            buffer.append("1234567");
        }
        for(int i=0; i<buffer.length();i++)
        {
            System.out.println(buffer.charAt(i));
        }
    }*/
}}

這個就是咱們修改後的模樣,雖然這個按照阿里巴巴他們的格式來定的,誰叫他們有錢呢,哎,雖然規範代碼是一件比較繁瑣的事情,可是他仍是有好處的,閒的時候能夠鍛鍊鍛鍊 Alt+Enter鍵位的練習,能夠幫助咱們規範一下本身的代碼格式,讓本身的代碼樣子更加好看一點。編程

2、第二個實驗:協同測試
一、首先,咱們在以前的結對編程中,就有過這樣一個項目,三我的一塊兒管理,因此對於接觸到這個實驗,以爲並無什麼難度,就在碼雲裏面,對個人兩位結對隊友發起了加入個人項目的邀請。
數據結構

加入之後:
app

就進行咱們的測試:
ide

3、第三個實驗:重構
一、首先,咱們就開始下載結對隊友的代碼,而後加上咱們的重構,

好比就是這個樣子,重命名.......
我會在參考文獻里加入一個重構的介紹以及一些經常使用功能的介紹。

4、第三個實驗:密碼學應用
一、這個是咱們的重頭戲了,也是你們最感興趣的時候來了,讓咱們一一來進行介紹;

  • (1)凱撒密碼
public class javaCaesar {
    public static void main(String args[]) throws Exception{
        String s=args[0];
        int key=Integer.parseInt(args[1]);
        String es="";
        for(int i=0;i<s.length( );i++)
        {  char c=s.charAt(i);
            if(c>='a' && c<='z') // 是小寫字母
            { c+=key%26;  //移動key%26位
                if(c<'a') {
                    c+=26;  //向左超界
                }
                if(c>'z') {
                    c-=26;  //向右超界
                }
            }
            else if(c>='A' && c<='Z') // 是大寫字母
            {  c+=key%26;
                if(c<'A') {
                    c+=26;
                }
                if(c>'Z') {
                    c-=26;
                }
            }
            es+=c;
        }
        System.out.println(es);
    }
}

這個就是著名的凱撒密碼,凱撒密碼是羅馬擴張時期朱利斯•凱撒(Julius Caesar)創造的,用於加密經過信使傳遞的做戰命令。它將字母表中的字母移動必定位置而實現加密。

  • (2)Java對稱加密-DES算法
import java.io.*;
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;
public class SDec{
    public static void main(String args[]) throws Exception{
        // 獲取密文
        FileInputStream f=new FileInputStream("SEnc.dat");
        int num=f.available();
        byte[ ] ctext=new byte[num];
        f.read(ctext);
        // 獲取密鑰
        FileInputStream  f2=new FileInputStream("keykb1.dat");
        int num2=f2.available();
        byte[ ] keykb=new byte[num2];
        f2.read(keykb);
        SecretKeySpec k=new  SecretKeySpec(keykb,"DESede");
        // 解密
        Cipher cp=Cipher.getInstance("DESede");
        cp.init(Cipher.DECRYPT_MODE, k);
        byte []ptext=cp.doFinal(ctext);
        // 顯示明文
        String p=new String(ptext,"UTF8");
        System.out.println(p);
    }
}
import java.io.*;
import java.security.*;
import javax.crypto.*;
public class SEnc{
    public static void main(String args[]) throws Exception{
        String s="Hello World!";
        FileInputStream f=new FileInputStream("key1.dat");
        ObjectInputStream b=new ObjectInputStream(f);
        Key k=(Key)b.readObject( );
        Cipher cp=Cipher.getInstance("DESede");
        cp.init(Cipher.ENCRYPT_MODE, k);
        byte ptext[]=s.getBytes("UTF8");
        for(int i=0;i<ptext.length;i++){
            System.out.print(ptext[i]+",");
        }
        System.out.println("");
        byte ctext[]=cp.doFinal(ptext);
        for(int i=0;i<ctext.length;i++){
            System.out.print(ctext[i] +",");
        }
        FileOutputStream f2=new FileOutputStream("SEnc.dat");
        f2.write(ctext);
    }
}
import java.io.*;
import javax.crypto.*;
public class Skey_DES{
    public static void main(String args[])
            throws Exception{
        KeyGenerator kg=KeyGenerator.getInstance("DESede");
        kg.init(168);
        SecretKey k=kg.generateKey( );
        FileOutputStream  f=new FileOutputStream("key1.dat");
        ObjectOutputStream b=new  ObjectOutputStream(f);
        b.writeObject(k);
    }
}
import java.io.*;
import java.security.*;
public class Skey_kb{
    public static void main(String args[]) throws Exception{
        FileInputStream f=new FileInputStream("key1.dat");
        ObjectInputStream b=new ObjectInputStream(f);
        Key k=(Key)b.readObject( );
        byte[ ] kb=k.getEncoded( );
        FileOutputStream  f2=new FileOutputStream("keykb1.dat");
        f2.write(kb);
        // 打印密鑰編碼中的內容
        for(int i=0;i<kb.length;i++){
            System.out.print(kb[i]+",");
        }
    }
}
  • (3)Java非對稱加密-RSA算法
import java.security.*;
import java.security.spec.*;
import javax.crypto.*;
import javax.crypto.spec.*;
import javax.crypto.interfaces.*;
import java.security.interfaces.*;
import java.math.*;
import java.io.*;
public class Dec_RSA{
    public static void main(String args[]) throws Exception{
        //讀取密文
        BufferedReader in=
                new BufferedReader(new InputStreamReader(
                        new FileInputStream("Enc_RSA.dat")));
        String ctext=in.readLine();
        BigInteger c=new BigInteger(ctext);
        //讀取私鑰
        FileInputStream f=new FileInputStream("Skey_RSA_priv.dat");
        ObjectInputStream b=new ObjectInputStream(f);
        RSAPrivateKey prk=(RSAPrivateKey)b.readObject( );
        BigInteger d=prk.getPrivateExponent();
        //獲取私鑰參數及解密
        BigInteger n=prk.getModulus();
        System.out.println("d= "+d);
        System.out.println("n= "+n);
        BigInteger m=c.modPow(d,n);
        //顯示解密結果
        System.out.println("m= "+m);
        byte[] mt=m.toByteArray();
        System.out.println("PlainText is ");
        for(int i=0;i<mt.length;i++){
            System.out.print((char) mt[i]);
        }
    }
}
import java.security.*;
import java.security.spec.*;
import javax.crypto.*;
import javax.crypto.spec.*;
import javax.crypto.interfaces.*;
import java.security.interfaces.*;
import java.math.*;
import java.io.*;
public class Enc_RSA{
    public static void main(String args[]) throws Exception{
        String s="Hello World!";
        // 獲取公鑰及參數e,n
        FileInputStream f=new FileInputStream("Skey_RSA_pub.dat");
        ObjectInputStream b=new ObjectInputStream(f);
        RSAPublicKey  pbk=(RSAPublicKey)b.readObject( );
        BigInteger e=pbk.getPublicExponent();
        BigInteger n=pbk.getModulus();
        System.out.println("e= "+e);
        System.out.println("n= "+n);
        // 明文 m
        byte ptext[]=s.getBytes("UTF8");
        BigInteger m=new BigInteger(ptext);
        // 計算密文c,打印
        BigInteger c=m.modPow(e,n);
        System.out.println("c= "+c);
        // 保存密文
        String cs=c.toString( );
        BufferedWriter out=
                new BufferedWriter(new OutputStreamWriter(
                        new FileOutputStream("Enc_RSA.dat")));
        out.write(cs,0,cs.length( ));
        out.close( );

    }
}
import java.io.*;
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;

public class Skey_RSA{
    public static void main(String args[]) throws Exception{
        KeyPairGenerator kpg=KeyPairGenerator.getInstance("RSA");
        kpg.initialize(1024);
        KeyPair kp=kpg.genKeyPair();
        PublicKey pbkey=kp.getPublic();
        PrivateKey prkey=kp.getPrivate();
        //  保存公鑰
        FileOutputStream  f1=new FileOutputStream("Skey_RSA_pub.dat");
        ObjectOutputStream b1=new  ObjectOutputStream(f1);
        b1.writeObject(pbkey);
        //  保存私鑰
        FileOutputStream  f2=new FileOutputStream("Skey_RSA_priv.dat");
        ObjectOutputStream b2=new  ObjectOutputStream(f2);
        b2.writeObject(prkey);
    }
}
  • (4)使用密鑰協定建立共享密鑰
import java.io.*;
import java.math.*;
import java.security.*;
import java.security.spec.*;
import javax.crypto.*;
import javax.crypto.spec.*;
import javax.crypto.interfaces.*;

public class Key_DH{
       //三個靜態變量的定義從
// C:\j2sdk-1_4_0-doc\docs\guide\security\jce\JCERefGuide.html
// 拷貝而來
// The 1024 bit Diffie-Hellman modulus values used by SKIP
    private static final byte skip1024ModulusBytes[] = {
        (byte)0xF4, (byte)0x88, (byte)0xFD, (byte)0x58,
        (byte)0x4E, (byte)0x49, (byte)0xDB, (byte)0xCD,
        (byte)0x20, (byte)0xB4, (byte)0x9D, (byte)0xE4,
        (byte)0x91, (byte)0x07, (byte)0x36, (byte)0x6B,
        (byte)0x33, (byte)0x6C, (byte)0x38, (byte)0x0D,
        (byte)0x45, (byte)0x1D, (byte)0x0F, (byte)0x7C,
        (byte)0x88, (byte)0xB3, (byte)0x1C, (byte)0x7C,
        (byte)0x5B, (byte)0x2D, (byte)0x8E, (byte)0xF6,
        (byte)0xF3, (byte)0xC9, (byte)0x23, (byte)0xC0,
        (byte)0x43, (byte)0xF0, (byte)0xA5, (byte)0x5B,
        (byte)0x18, (byte)0x8D, (byte)0x8E, (byte)0xBB,
        (byte)0x55, (byte)0x8C, (byte)0xB8, (byte)0x5D,
        (byte)0x38, (byte)0xD3, (byte)0x34, (byte)0xFD,
        (byte)0x7C, (byte)0x17, (byte)0x57, (byte)0x43,
        (byte)0xA3, (byte)0x1D, (byte)0x18, (byte)0x6C,
        (byte)0xDE, (byte)0x33, (byte)0x21, (byte)0x2C,
        (byte)0xB5, (byte)0x2A, (byte)0xFF, (byte)0x3C,
        (byte)0xE1, (byte)0xB1, (byte)0x29, (byte)0x40,
        (byte)0x18, (byte)0x11, (byte)0x8D, (byte)0x7C,
        (byte)0x84, (byte)0xA7, (byte)0x0A, (byte)0x72,
        (byte)0xD6, (byte)0x86, (byte)0xC4, (byte)0x03,
        (byte)0x19, (byte)0xC8, (byte)0x07, (byte)0x29,
        (byte)0x7A, (byte)0xCA, (byte)0x95, (byte)0x0C,
        (byte)0xD9, (byte)0x96, (byte)0x9F, (byte)0xAB,
        (byte)0xD0, (byte)0x0A, (byte)0x50, (byte)0x9B,
        (byte)0x02, (byte)0x46, (byte)0xD3, (byte)0x08,
        (byte)0x3D, (byte)0x66, (byte)0xA4, (byte)0x5D,
        (byte)0x41, (byte)0x9F, (byte)0x9C, (byte)0x7C,
        (byte)0xBD, (byte)0x89, (byte)0x4B, (byte)0x22,
        (byte)0x19, (byte)0x26, (byte)0xBA, (byte)0xAB,
        (byte)0xA2, (byte)0x5E, (byte)0xC3, (byte)0x55,
        (byte)0xE9, (byte)0x2F, (byte)0x78, (byte)0xC7
    };
    // The SKIP 1024 bit modulus
    private static final BigInteger skip1024Modulus
              = new BigInteger(1, skip1024ModulusBytes);
    // The base used with the SKIP 1024 bit modulus
    private static final BigInteger skip1024Base = BigInteger.valueOf(2);
public static void main(String args[ ]) throws Exception{
    DHParameterSpec DHP=
new DHParameterSpec(skip1024Modulus,skip1024Base);

     KeyPairGenerator kpg= KeyPairGenerator.getInstance("DH");
     kpg.initialize(DHP);
     KeyPair kp=kpg.genKeyPair();

     PublicKey pbk=kp.getPublic();
     PrivateKey prk=kp.getPrivate();
     // 保存公鑰
     FileOutputStream  f1=new FileOutputStream(args[0]);
     ObjectOutputStream b1=new  ObjectOutputStream(f1);
     b1.writeObject(pbk);
     // 保存私鑰
     FileOutputStream  f2=new FileOutputStream(args[1]);
     ObjectOutputStream b2=new  ObjectOutputStream(f2);
     b2.writeObject(prk);
   }      
}

可能會有人問,爲何你要把全部的代碼都粘這上面呢,是否是想要以爲博客長呢,在這裏我給出兩點緣由:

  • 首先,我以爲,說不定之後我會用這個東西,可是又由於婁老師的博客太複雜,或許當時我只是須要代碼,因此我以爲留下這一份能夠給我之後複習或者之後再用留下資源;

  • 其次,是以爲博客長,但長又能說明什麼呢,有些人寧願少一點,也不肯本身再清楚一點,這些東西就像手裏過一遍同樣,就像那句老話「眼過千遍,不如手過一遍」,這樣記錄一遍,腦子裏總會是留下影響的,會充實本身的。

3、實驗過程當中遇到的問題和解決過程

  • 問題1:本次實驗的目的是什麼呢,由於我發現,本次實驗不少部分都是在複製粘貼代碼,並且不少時候還有不少人並無很仔細的去看婁老師博客裏的一些非常細節的東西,那本次博客對於咱們自己有什麼好處?

  • 問題1解答:首先,我以爲本次實驗一是爲了讓咱們更加了解一些idea的功能,而且經過結對編程咱們可讓咱們集體的力量變得更增強大,經過碼雲的的共享,咱們能夠及時發現對方代碼的問題而且及時爲他指出或者點明,因此我以爲從瞭解層面是這樣的;二是,由於咱們這個專業不接觸密碼學,因此須要補充一些密碼學相關的知識,驅使咱們去了解密碼學,讓本身身爲一名電科院學子居然連密碼學的概念都不瞭解一點,因此爲了提升咱們的基礎學科能力,也是須要這樣的一次實驗去提高咱們的自我知識和自個人學習能力。

其餘(感悟、思考等)

  • 最近感受任務的確是輕鬆了一點,可是仍舊不容小覷,由於立刻要迎來複習階段,因此如何讓本身更快的投身自我複習和及時答辯的狀態相當重要,但願你們要及時發現問題,及時糾正,不要把不少東西拖到事到臨頭的地步才感受本身渾身上下難受,學會讓本身更加充實地過好每一天,加油!

參考資料

Java 密碼學算法
Java程序設計
藍墨雲
實驗三 敏捷開發與XP實踐

相關文章
相關標籤/搜索