常见的加解密算法

开门见山,先说主题,这篇文章讲的是java中的加密解密一些常用的算法。
首先介绍base64算法,base64算法的加解密算法都是公开的,所以只能糊弄一般的群众,对稍微懂一点互联网以及代码知识的人基本无用,不说了,上代码:

       String text = "123456"; //需要加密的数据
        //base64加密解密
        //1.加密
        Base64.Encoder encoder = Base64.getEncoder();
        byte[] encode = encoder.encode(text.getBytes());
        System.out.println(new String(encode)); //加密后的密文是:MTIzNDU2,成功加密
        //2.解密
        Base64.Decoder decoder = Base64.getDecoder();
        byte[] decode = decoder.decode(encode);
        System.out.println(new String(decode)); //解密后是:123456,成功解密

2.DES对称加密算法。
DES加密最重要的是有一个暗号,也就是密钥,这个密钥要求至少是8位的字符,只要密钥不泄露,那么加密就没问题。上代码:

        String text = "123456";
        String key = "哈哈哈哈哈哈哈哈哈哈";
        //1.生成密钥
        DESKeySpec desKeySpec = new DESKeySpec(key.getBytes());
        SecretKeyFactory desKeyFactory = SecretKeyFactory.getInstance("des");
        SecretKey secretKey = desKeyFactory.generateSecret(desKeySpec);
        //2.密钥上面已经生成,现在进行加密
        Cipher cipher = Cipher.getInstance("des");
        cipher.init(Cipher.ENCRYPT_MODE,secretKey,new SecureRandom());//密钥在这里应用了
        byte[] encryptData = cipher.doFinal(text.getBytes());
        System.out.println(new String(encryptData));//打印的数据是:�b:���,成功加密
        //3.为了便于观察加密数据,再使用base64转换密文
        Base64.Encoder encoder = Base64.getEncoder();
        byte[] encode = encoder.encode(encryptData);
        System.out.println(new String(encode));//打印的数据是:gQ33YjqHy+I=  (这样的数据就好看多了)
        //4.des解密
        cipher.init(Cipher.DECRYPT_MODE,secretKey,new SecureRandom());//解密的时候这里再次用到了加密时候的secretKey
        byte[] decodeData = cipher.doFinal(encryptData);
        System.out.println(new String(decodeData));//打印的解密数据是:123456,成功解密

3.MD5加密算法
md5加密算法是一种单向加密算法,只能加密,无法解密。这种不可逆加密算法可以用于验证数据的完整性或用于登陆密码这样的功能。

    String text = "123456"; //需要解密的数据
        //1.创建md5加密对象
        MessageDigest md5 = MessageDigest.getInstance("md5");
        //2.进行加密操作
        byte[] digest = md5.digest(text.getBytes());
        //3.转化为十六进制的字符串
        StringBuilder stringBuilder = new StringBuilder();
        for (byte data: digest) {
            String s = Integer.toHexString(data & 0xff); //byte类型的数据最高位是符号位,通过和0xff进行与操作,转换为int类型的正整数。 
            stringBuilder.append(s.length() == 1 ? "0" + s : s);// 如果该正数小于16(长度为1个字符),前面拼接0占位:确保最后生成的是32位字符串。 
        }
        System.out.println(stringBuilder.toString()); //打印结果e10adc3949ba59abbe56e057f20f883e,成功加密

4.RSA非对称加密算法。
RSA非堆成加密是指用于加密的密钥是一对,一个叫做公钥,一个叫做私钥,这两个密钥是不一样的,但是它们任何一方加密,对方都会解密。一般服务器用私钥进行加密,客户端用公钥进行解密。当然客户端也可以用公钥加密,服务器用私钥解密。

//RSA加密
        String text = "123456"; //需要解密的数据
        //1.创建密钥对KeyPair
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("rsa");
        keyPairGenerator.initialize(1024);//密钥长度是1024
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        //2.获取公钥和私钥
        PublicKey publicKey = keyPair.getPublic();
        PrivateKey privateKey = keyPair.getPrivate();
        //3.用私钥加密数据
        Cipher cipher = Cipher.getInstance("rsa");
        cipher.init(Cipher.ENCRYPT_MODE,privateKey,new SecureRandom());
        byte[] cipherData = cipher.doFinal(text.getBytes());
        System.out.println(new String(cipherData));//打印密文: ���i�,�2���WC1��b�m�S���&�����5�����WFB�����HJ��HN��]�;Pq�A������}G�
        //4.使用公钥解密
        cipher.init(Cipher.DECRYPT_MODE,publicKey,new SecureRandom());
        byte[] decodeData = cipher.doFinal(cipherData);
        System.out.println(new String(decodeData)); //解密数据:123456,解密成功
        //5.通过私钥和密文对传输的数据生成数字签名
        Signature signature = Signature.getInstance("MD5withRSA");
        signature.initSign(privateKey);
        signature.update(cipherData);
        byte[] sign = signature.sign();
        System.out.println(new String(sign));//打印签名:���k��T��%�ȣ86o�ک!�W�7���
        //6.根据公钥和密文验证数据是否被修改过
        signature.initVerify(publicKey);
        signature.update(cipherData);
        boolean verify = signature.verify(sign);
        System.out.println(verify); //打印结果,验证结果:true
        
        //注意,我们发现RSA加密后的数据也是可读性很差,所以,我们可以用base64转换数据之后再传输

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,042评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,996评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,674评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,340评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,404评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,749评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,902评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,662评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,110评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,577评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,258评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,848评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,726评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,952评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,271评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,452评论 2 348