課程:《程序設計與數據結構》
班級: 1723
姓名: 王文彬
學號:20172329
實驗教師:王志強
實驗日期:2018年5月10日
必修/選修: 必修php
(1)代碼規範html
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
(3)重構git
(4)密碼學應用web
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、第三個實驗:密碼學應用
一、這個是咱們的重頭戲了,也是你們最感興趣的時候來了,讓咱們一一來進行介紹;
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)創造的,用於加密經過信使傳遞的做戰命令。它將字母表中的字母移動必定位置而實現加密。
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]+","); } } }
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); } }
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); } }
可能會有人問,爲何你要把全部的代碼都粘這上面呢,是否是想要以爲博客長呢,在這裏我給出兩點緣由:
首先,我以爲,說不定之後我會用這個東西,可是又由於婁老師的博客太複雜,或許當時我只是須要代碼,因此我以爲留下這一份能夠給我之後複習或者之後再用留下資源;
其次,是以爲博客長,但長又能說明什麼呢,有些人寧願少一點,也不肯本身再清楚一點,這些東西就像手裏過一遍同樣,就像那句老話「眼過千遍,不如手過一遍」,這樣記錄一遍,腦子裏總會是留下影響的,會充實本身的。
問題1:本次實驗的目的是什麼呢,由於我發現,本次實驗不少部分都是在複製粘貼代碼,並且不少時候還有不少人並無很仔細的去看婁老師博客裏的一些非常細節的東西,那本次博客對於咱們自己有什麼好處?
問題1解答:首先,我以爲本次實驗一是爲了讓咱們更加了解一些idea的功能,而且經過結對編程咱們可讓咱們集體的力量變得更增強大,經過碼雲的的共享,咱們能夠及時發現對方代碼的問題而且及時爲他指出或者點明,因此我以爲從瞭解層面是這樣的;二是,由於咱們這個專業不接觸密碼學,因此須要補充一些密碼學相關的知識,驅使咱們去了解密碼學,讓本身身爲一名電科院學子居然連密碼學的概念都不瞭解一點,因此爲了提升咱們的基礎學科能力,也是須要這樣的一次實驗去提高咱們的自我知識和自個人學習能力。