• 20162311 实验三 敏捷开发与XP实践 实验报告


    20162311 实验三 敏捷开发与XP实践 实验报告

    实验内容

    一、研究学习IDEA中的Code菜单

    使用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));
    }
    }
    

    找出一项自己感觉最好的功能


    个人认为Surround With这个功能不错,可以将一段代码用一些常用的if/elsetry/catchwhile等包围起来。

    二、下载搭档的Complex代码进行单元测试

    添加了三个测试用例,运行结果如下

    三、下载搭档代码进行至少三项重构

    先在实验三 敏捷开发与XP实践中学习了重构,然后下载搭档代码进行练习

    我进行的三项重构分别为

    • Rename
    • Ecapsulate Fields
    • Extract Methods

    四、学习Java 密码学算法

    参考Java 密码学算法,以结对的方式完成Java密码学相关内容的学习,结合重构,git,代码标准。

    (一)凯撒密码

    • 凯撒密码的加密算法过程如下:

    在这里,我们做此约定:明文记为m,密文记为c,加密变换记为E(k1,m)(其中k1为密钥),解密变换记为D(k2,m)(k2为解密密钥)(在这里k1=k2,不妨记为k)。凯撒密码的加密过程可记为如下一个变换:

    c≡m+k mod n (其中n为基本字符个数)

    同样,解密过程可表示为:
    m≡c+k mod n (其中n为基本字符个数)

    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);
         }
    

    该程序既可用于加密又可用于解密。只要执行:

    java Caesar 明文(要加密的字符串) 密钥(移动的位数)

    即可加密。
    在密钥前面加上负号,将运行

    java Caesar 密文(要解密的字符串) -密钥(移动的位数)

    即可解密。

    • 下面我用Hello World试验

    加密

    解密

    (二)Java对称加密-DES算法

    此种加密算法在加密和解密时使用的是同一密钥。博客中的示例将密钥生成在key1.dat文件中,编码格式保存于keykb1.dat中,加密时从key1.dat中获取密钥并将密文保存在SEnc.dat文件中。解密时从keykb1.dat中获取编码格式并解密。

    • 以下是加密和解密截图

    加密

    解密

    (三)Java非对称加密-RSA算法

    Java非对称加密-RSA算法是指加密和解密时使用不同的密钥。同时,传递密文的双方A和B可以各自有一套公钥和私钥。A用B的公钥加密信息,传递给B,B再用自己的私钥解密,同理B也是如此

    我先运行如下代码,把自己的公钥和私钥分别生成在Skey_RSA_pub20162311.datSkey_RSA_priv20162311.dat两个不同的文件中。

    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_pub20162311.dat");
            ObjectOutputStream b1=new  ObjectOutputStream(f1);
            b1.writeObject(pbkey);
            //  保存私钥
            FileOutputStream  f2=new FileOutputStream("Skey_RSA_priv20162311.dat");
            ObjectOutputStream b2=new  ObjectOutputStream(f2);
            b2.writeObject(prkey);
       }
    }
    

    然后加密

    package exp3;
    
    /**
     * Created by Administrator on 2017/5/10.
     */
    
    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= args[0];
            // 获取公钥及参数e,n
            FileInputStream f=new FileInputStream("Skey_RSA_pub20162311.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( );
    
        }
    }
    
    

    再用私钥解密

    package exp3;
    
    /**
     * Created by Administrator on 2017/5/10.
     */
    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_priv20162311.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]);
            }
        }
    }
    

    我把加密和解密的方法写入了EncryptAndDecrypt类中,然后在RSATest类中调用加密和解密的方法,就能在一个程序中同时加密和解密

    RSATest类中实例化一个EncryptAndDecrypt对象。

    package exp3;
    
    /**
     * Created by Administrator on 2017/5/11.
     */
    public class RSATest {
        public static void main(String[] args) throws Exception {
            String s = args[0];
    
            EncryptAndDecrypt ead = new EncryptAndDecrypt("Skey_RSA_pub20162311.dat", "Enc_RSA.dat","Skey_RSA_priv20162311.dat");
            ead.Encrypt(s);
    
            ead.Decrypt();
        }
    }
    
    

    实验问题

    前三个实验比较简单,没有遇到什么问题,但是在练习Java非对称加密-RSA算法时遇到一个比较麻烦的问题。

    • 问题:我和我的搭档各自生成了自己的公钥和私钥,我将搭档的公钥拷贝到我的IDEA上,然后用搭档的公钥进行加密,却出现了异常

    搭档在自己的IDEA中可以用自己的公钥进行加密,但到了我的IDEA中就不行了。我请教了老师,老师将我们的代码git pull在Linux命令行下运行了,发现也不行,最后老师说是环境问题,所以我放弃了用搭档的公钥加密,再把密文传给搭档,让其用私钥解密的试验。

    实验收获与感想

    一、收获

    本次实验收获如下

    • 学会了IDEA的Code菜单中的许多实用的功能
    • 学会了如何对代码进行重构
    • 学会使用一些基础的Java密码学算法

    二、感想

    学习Java这门语言已经大半个学期了,从最开始的在命令行下敲代码,到现在用IDEA编程序,感觉自己的成长还是比较明显的。通过这次实验,我发现Java中包含了许多知识,不仅是编程,还有很多以前没有接触过的思维方式。这次实验我能明显感觉到没有前两次那么艰难,老师教的学习方法还是有很大用处的。这学期还有两次实验,希望自己能做的更好。

  • 相关阅读:
    java_29打印流
    java_26 缓冲流
    java-27 Properties类的使用
    java_24.1文件流的应用--复制文件
    java_25 FileReader类和FileWriter类
    java_25.1字节转为字符OutputStreamWriter
    java_23 File类
    java_24 FileOutputStream类和FileInputStream类
    java_21 Set接口、HashSet类、LinkedSet类
    随机数Random和静态函数Math
  • 原文地址:https://www.cnblogs.com/-zzr-/p/6849887.html
Copyright © 2020-2023  润新知