首页 > 其他分享 >10.23

10.23

时间:2024-10-25 15:21:52浏览次数:1  
标签:10.23 String System println import data out

[实验任务一]:加密算法

目前常用的加密算法有DES(Data Encryption Standard)和IDEA(International Data Encryption Algorithm)国际数据加密算法等,请用工厂方法实现加密算法系统。

实验要求:

1. 画出对应的类图;

 

 

 

2. 提交该系统的代码,该系统务必是一个可以能够直接使用的系统,查阅资料完成相应加密算法的实现;

package org.example;

/*
* Copyright 2001-2005 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

import java.io.IOException;
import javax.portlet.PortletConfig;
import javax.portlet.GenericPortlet;
import javax.portlet.PortletException;
import javax.portlet.PortletRequestDispatcher;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import javax.portlet.WindowState;

public class MyPortlet extends GenericPortlet {

   private static final String NORMAL_VIEW = "/normal.jsp";
   private static final String MAXIMIZED_VIEW = "/maximized.jsp";
   private static final String HELP_VIEW = "/help.jsp";

   private PortletRequestDispatcher normalView;
   private PortletRequestDispatcher maximizedView;
   private PortletRequestDispatcher helpView;

   public void doView( RenderRequest request, RenderResponse response )
       throws PortletException, IOException {

       if( WindowState.MINIMIZED.equals( request.getWindowState() ) ) {
           return;
       }

       if ( WindowState.NORMAL.equals( request.getWindowState() ) ) {
           normalView.include( request, response );
       } else {
           maximizedView.include( request, response );
       }
   }

   protected void doHelp( RenderRequest request, RenderResponse response )
       throws PortletException, IOException {

       helpView.include( request, response );

   }

   public void init( PortletConfig config ) throws PortletException {
       super.init( config );
       normalView = config.getPortletContext().getRequestDispatcher( NORMAL_VIEW );
       maximizedView = config.getPortletContext().getRequestDispatcher( MAXIMIZED_VIEW );
       helpView = config.getPortletContext().getRequestDispatcher( HELP_VIEW );
   }

   public void destroy() {
       normalView = null;
       maximizedView = null;
       helpView = null;
       super.destroy();
   }

}

import javax.crypto.Cipher;

import javax.crypto.KeyGenerator;

import javax.crypto.SecretKey;

 

 

public class DES  implements Method {

 

    public  void work(String str,String password,String codeStringBegin) {

        String codeStringEnd=null;             //加密后的密文

        String decodeString=null;  //密文解密后得到的明文

        System.out.println("要加密的明文:20223867 尹丹彤"+codeStringBegin);

        String cipherType = "DESede"; //加密算法类型,可设置为DES、DESede、AES等字符串

        try

        {

            //获取密钥生成器

            KeyGenerator keyGen=KeyGenerator.getInstance(cipherType);

            //初始化密钥生成器,不同的加密算法其密钥长度可能不同

            keyGen.init(112);

            //生成密钥

            SecretKey key=keyGen.generateKey();

 

            //得到密钥字节码

            byte[] keyByte=key.getEncoded();

            //输出密钥的字节码

            System.out.println("密钥是:");

            for(int i=0;i<keyByte.length;i++)

            {

                System.out.print(keyByte[i]+",");

            }

            System.out.println("");

            //创建密码器

            Cipher cp=Cipher.getInstance(cipherType);

            //初始化密码器

            cp.init(Cipher.ENCRYPT_MODE,key);

            System.out.println("要加密的字符串是:"+ codeStringBegin);

            byte[] codeStringByte=codeStringBegin.getBytes("UTF8");

            System.out.println("要加密的字符串对应的字节码是:");

            for(int i=0;i<codeStringByte.length;i++)

            {

                System.out.print(codeStringByte[i]+",");

            }

            System.out.println("");

            //开始加密

            byte[] codeStringByteEnd=cp.doFinal(codeStringByte);

            System.out.println("加密后的字符串对应的字节码是:");

            for(int i=0;i<codeStringByteEnd.length;i++)

            {

                System.out.print(codeStringByteEnd[i]+",");

            }

            System.out.println("");

            codeStringEnd=new String(codeStringByteEnd);

            System.out.println("加密后的字符串是:" + codeStringEnd);

            System.out.println("");

            //重新初始化密码器

            cp.init(Cipher.DECRYPT_MODE,key);

            //开始解密

            byte[] decodeStringByteEnd=cp.doFinal(codeStringByteEnd);

            System.out.println("解密后的字符串对应的字节码是:");

            for(int i=0;i<decodeStringByteEnd.length;i++)

            {

                System.out.print(decodeStringByteEnd[i]+",");

            }

            System.out.println("");

            decodeString=new String(decodeStringByteEnd);

            System.out.println("解密后的字符串是:" + decodeString);

            System.out.println("");

        }

        catch(Exception e)

        {

            e.printStackTrace();

        }

    }

 

 

}

import javax.crypto.Cipher;

import javax.crypto.KeyGenerator;

import javax.crypto.SecretKey;

import org.apache.commons.codec.binary.Base64;

import org.bouncycastle.jce.provider.BouncyCastleProvider;

 

import javax.crypto.Cipher;

import javax.crypto.KeyGenerator;

import javax.crypto.SecretKey;

import javax.crypto.spec.SecretKeySpec;

import java.security.Key;

import java.security.Security;

 

 

public class IDEA implements Method{

 

    public static final String KEY_ALGORITHM="IDEA";

 

    public static final String CIPHER_ALGORITHM="IDEA/ECB/ISO10126Padding";

    public static byte[] initkey() throws Exception{

        //加入bouncyCastle支持

        Security.addProvider(new BouncyCastleProvider());

 

        //实例化密钥生成器

        KeyGenerator kg=KeyGenerator.getInstance(KEY_ALGORITHM);

        //初始化密钥生成器,IDEA要求密钥长度为128位

        kg.init(128);

        //生成密钥

        SecretKey secretKey=kg.generateKey();

        //获取二进制密钥编码形式

        return secretKey.getEncoded();

    }

    /**

     * 转换密钥

     * @param key 二进制密钥

     * @return Key 密钥

     * */

    private static Key toKey(byte[] key) throws Exception{

        //实例化DES密钥

        //生成密钥

        SecretKey secretKey=new SecretKeySpec(key,KEY_ALGORITHM);

        return secretKey;

    }

 

    /**

     * 加密数据

     * @param data 待加密数据

     * @param key 密钥

     * @return byte[] 加密后的数据

     * */

    private static byte[] encrypt(byte[] data,byte[] key) throws Exception{

        //加入bouncyCastle支持

        Security.addProvider(new BouncyCastleProvider());

        //还原密钥

        Key k=toKey(key);

        //实例化

        Cipher cipher=Cipher.getInstance(CIPHER_ALGORITHM);

        //初始化,设置为加密模式

        cipher.init(Cipher.ENCRYPT_MODE, k);

        //执行操作

        return cipher.doFinal(data);

    }

    /**

     * 解密数据

     * @param data 待解密数据

     * @param key 密钥

     * @return byte[] 解密后的数据

     * */

    private static byte[] decrypt(byte[] data,byte[] key) throws Exception{

        //加入bouncyCastle支持

        Security.addProvider(new BouncyCastleProvider());

        //还原密钥

        Key k =toKey(key);

        Cipher cipher=Cipher.getInstance(CIPHER_ALGORITHM);

        //初始化,设置为解密模式

        cipher.init(Cipher.DECRYPT_MODE, k);

        //执行操作

        return cipher.doFinal(data);

    }

    public static String getKey(){

        String result = null;

        try {

            result = Base64.encodeBase64String(initkey());

        } catch (Exception e) {

            e.printStackTrace();

        }

        return result;

    }

    public static String ideaEncrypt(String data, String key) {

        String result = null;

        try {

            byte[] data_en = encrypt(data.getBytes(), Base64.decodeBase64(key));

            result = Base64.encodeBase64String(data_en);

        } catch (Exception e) {

            e.printStackTrace();

        }

        return result;

    }

 

    public static String ideaDecrypt(String data, String key) {

        String result = null;

        try {

            byte[] data_de =decrypt(Base64.decodeBase64(data), Base64.decodeBase64(key));;

            result = new String(data_de);

        } catch (Exception e) {

            e.printStackTrace();

        }

        return result;

    }

 

    public  void work(String str,String password,String data) {

        String key = getKey();

        System.out.println("要加密的原文:"+data);

        System.out.println("密钥:" + key);

        String data_en = ideaEncrypt(data, key);

        System.out.println("密文:"+data_en);

        String data_de = ideaDecrypt(data_en, key);

        System.out.println("原文:"+data_de);

    }

 

}

mport java.util.Scanner;

 

public class Main {

 

    public static void main(String[] args) {

 

        DES des=new DES();

        IDEA idea=new IDEA();

        try {

            int n = 0;

 

            Scanner in = new Scanner(System.in);

            while (n != 3) {

                System.out.println("请选择要使用的加密算法 1.DES加密算法 2.IDEA加密算法");

                System.out.println("3.退出");

                System.out.println("请选择:");

                if (in.hasNextInt()) {

                    n = in.nextInt();

                } else {

                    System.out.println("输入的不是整数,请重新输入:");

                    continue;

                }

                switch (n) {

                    case 1: {

                        String a;

                        Scanner in1 = new Scanner(System.in);

                        System.out.println("选择加密文件:");

                        a = in1.nextLine();

                        des.work("1787878787878787","0E329232EA6D0D73",a);

                        break;

                    }

                    case 2: {

                        String b;

                        Scanner in2 = new Scanner(System.in);

                        System.out.println("选择加密文件:");

                        b = in2.nextLine();

                        idea.work("8787878787878787","0E329232EA6D0D73",b);

                        break;

                    }

                }

            }

        }

 

 

        catch(Exception e)

        {

            System.out.println(e.getMessage());

        }

    }

 

}

public interface Method {

    public abstract void work(String str,String password,String codeStringBegin);

}

3.注意编程规范。

标签:10.23,String,System,println,import,data,out
From: https://www.cnblogs.com/yindantong/p/18502626

相关文章

  • 10.23 测试用例
    设计测试用例编写技巧=================================一、查看用例的模板案例模板1:案例模板2:案例3:==========================================二、用例的要素讲解.编写用例的要素?用例编号,用例标题,前置条件,测试步骤,预期结果,优先级(必写)系统名称、模块名称、用例创......
  • 2024.10.23-25 杂题
    2024.10.23-25杂题P7323[WC2021]括号路径如果存在\((a,b,w)\),\((c,b,w)\)。那么\((a,c)\)就是一条合法路径。所以把\(a,c\)放入一个集合。然后合并新的的时候把\(w\)一样的合并了就行。最后统计每个"块"的数量,答案就是\(\sum_{i=1}^{n}C_{cnt_i}^{2}\)复杂度\(O(......
  • 2024.10.23 李赛
    A.CloseGroup直接状压。B.P1054[NOIP2005提高组]等价表达式傻逼吗???????怎么又不匹配的括号题面里还不说的?????建括号树,然后随一万个数判定即可。C.P7217[JOISC2020]収穫赛时感觉不可做就没做,看来我直觉还是挺准的,但是策队秒了。最重要的一步是观察到每个人摘了苹果之后下一个......
  • 10.23 闲话
    10.23闲话图论复习还有2天就复赛了,现在暂时不知道做啥题了,写一下这两天复习的图论知识。1.存图方式(1.)邻接矩阵没什么好说的,最简单的存图方式,一眼就会。定义矩阵数组\(a[n][n](n为点的数量数)\),\(a[u][v]=w\)代表\(u,v\)之间存在一条权值为\(w\)的路径。由于采用......
  • 团队练习记录2024.10.23
    比赛链接:https://codeforces.com/gym/104976D.OperatorPrecedence队友解的,想办法让第二个式子中括号内数值为1,所以就2,-1交替,最后一个选1可逆推,第一个为2*n-3#include<iostream>#include<queue>#include<map>#include<set>#include<vector>#include<algorithm>#inc......
  • 2024.10.23
      今天有些小忙。  中午和陈处去吃了一直久闻大名的铁锅炖,遗憾地发现其实也不过如此。吃饭时路上偶然谈到冬旭,算起来他已经走了1年半有余,而离我收到讣告几乎刚好一年。中间相差的半年,陈处一直不告诉我,这一点我至今不太能理解。可能那时候他真的,一想起此事就控制不住自......
  • 2024.10.23总结+CSP2024前总结
    赛时T1看完一脸懵逼啊,画了好几个立方体,一直觉得切四刀是14块,然后也找不到什么规律,就去看后面的题了,jsy说是15之后还是没想法,只觉着\(7=2^3-1\),\(15=2^4-1\),当\(n<=m\)时是\(2^n\),后来看回来把已知情况全列出来,找到\(f[i][j]=f[i][j-1]+f[i-1][j-1]\)的递推式,写了60pts的,但WA了......
  • 10.23日
    DDLDDL用于定义和管理数据库的结构。常见的DDL操作包括:创建表:使用CREATETABLE创建新表。修改表:使用ALTERTABLE修改表的结构,例如添加或删除列。删除表:使用DROPTABLE删除表及其所有数据。sqlCREATETABLEStudents(IDINTPRIMARYKEY,NameVARCHAR(100),Ag......
  • 10.23随笔
    这里是10.23随笔。今天我又发现了一种不一样的解题方法,题是昨天的题,这个方法是迭代,代码留档:intdegreeOneNodesIterative(structTreeNode*root){if(root==NULL){return0;}intcount=0;structTreeNode*current;SqQueuequeue;InitQueue(&queue);EnQueue(&qu......
  • 2024.10.23训练记录
    上午NOIP模拟A简单题。类比树状数组,反向做二维前缀和。在数组中对于左上角为{x_1,y_1},右下角为{x_2,y_2}的矩阵实现+k操作。只需要在{x_1,y_1},{x_2+1,y_2+1}位置+k,{x_2+1,y_1},{x_1,y_2+1}位置-k。最后再做一遍二维前缀和。很好想到的。想到是应该的。考试......