Java实现凯撒加密以及解密

本文针对的是asscii表中的字符。

**

代码

**

package Caesar;

/**
 * @创建人 
 * @创建时间 
 * @描述 凯撒加密以及解密
 *       默认仅要求得到英文字符时,密钥为0-26(0,26可以去除,没有意义),表里一共就这么多字符,超出去没有意义(环形)
 *       要求为asscii可显示字符时,密钥为0-95
 *       代码可以优化,加密解密都可以使用加密算法,无非密钥做个逆运算而已
 */
public class CaesarCipher {


    /**
     * 凯撒加密
     * @param s 原文,明文
     * @param key 凯撒加密的密钥,小于0为左移,大于0为右移
     * @return 返回加密后的字符串
     */
    private static String caesarEncrypt(String s,int key){

        //无论是左移还是右移,统一换算成右移
        if (key<0) key = 26+key;
        System.out.println("key === "+key);


        //将原文字符串拆分成字符数组,方便加密
        char[] chars = s.toCharArray();

        //引入一个字符串生成器,用于在移位加密之后,将字符数组重新返回字符串
        StringBuilder stringBuilder = new StringBuilder();

        //迭代字符数组,逐位加密
        for (char achar : chars) {

            //获取当前字符的asscii码
            int a = achar;

            /**
             * 当实际应用中要求:明文为英文,译文也为英文时
             */
            if (a>=65 && a<=90){ /** 大写字母*/
                //采用模运算,英文字母只有26个,asscii表不止,防止字母溢出,
                a = (a-65 + key) % 26;
                //StringBuilder的append函数将移位之后的字符asscii码转换,再添加入字符串中
                char newa = (char) (a+65);
                stringBuilder.append( newa );
            }else if (a>=97 && a<=122){  /** 小写字母*/

                //采用模运算,英文字母只有26个,asscii表不止,防止字母溢出,
                a = (a-97 + key) % 26;
                //StringBuilder的append函数将移位之后的字符asscii码转换,再添加入字符串中
                char newa = (char) (a+97);
                stringBuilder.append( newa );
            }


            /**
             * 当实际应用中要求:asscii表中可显示字符即可
             * 可显示字符为32-126
             */
            //无论是左移还是右移,统一换算成右移
//            if (key<0) key = 95+key;
//            System.out.println("key === "+key);
//            a = (a - 32 + key) % 95;
//            char newa = (char) (a + 32);
//            stringBuilder.append(newa);

        }

        return stringBuilder.toString();
    }


    /**
     * 凯撒解密
     * @param s 密文
     * @param key 密钥 小于0为左移,大于0为右移,此处密钥为加密秘钥,函数内已做逆运算
     * @return 解密后的明文
     */
    private static String caesarDecrypt(String s, int key){


        //无论是左移还是右移,统一换算成右移
        if (key>0) key = 26-key;
        System.out.println("key === "+key);


        //将密文字符串拆分成字符数组,方便逐个解密
        char[] chars = s.toCharArray();

        //引入一个字符串生成器,用于在解密之后,将字符数组重新返回字符串
        StringBuilder stringBuilder = new StringBuilder();

        //迭代字符数组,逐位解密
        for (char achar : chars) {

            //获取当前字符的asscii码
            int a = achar;

            /**
             * 当实际应用中要求:明文为英文,译文也为英文时
             *
             */
            if (a>=65 && a<=90){ /** 大写字母*/
                //采用模运算,英文字母只有26个,asscii表不止,防止字母溢出,
                a = (a-65 + key ) %  26;
                //StringBuilder的append函数将移位之后的字符asscii码转换,再添加入字符串中
                char newa = (char) (a+65);
                stringBuilder.append( newa );
            }else if (a>=97 && a<=122){  /** 小写字母*/

                //采用模运算,英文字母只有26个,asscii表不止,防止字母溢出,
                a = (a-97  + key ) % 26;
                //StringBuilder的append函数将移位之后的字符asscii码转换,再添加入字符串中
                char newa = (char) (a+97);
                stringBuilder.append( newa );
            }


            /**
             * 当实际应用中要求:asscii表中可显示字符即可
             * 可显示字符为32-126
             */
            //无论是左移还是右移,统一换算成右移
//            if (key>0) key = 95-key;
//            System.out.println("key === "+key);
//            a = (a - 32) % 95 + key;
//            char newa = (char) (a + 32);
//            stringBuilder.append(newa);

        }

        return stringBuilder.toString();


    }



    /**
     * 测试main函数
     *
     */
    public static void main(String[] args) {
        String s = caesarEncrypt("abczABCZ",3);
        System.out.println("密码为:" + s);
        System.out.println("解密文为:" + caesarDecrypt(s,3));
    }


}

测试图

加密时为明文右移3位,解密时密文左移3位就等同于密文右移23位(针对于字母,要求为asscii表可显示字符时,周期95)。
加密解密测试图

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值