Java和PHP加解密

PHP代码

 1 <?php
 2 //DES加解密工具
 3 class DesEncrypt {
 4     var $key;
 5     var $iv;
 6     function DesEncrypt($key, $iv=0) {
 7         $this->key = $key;
 8         if($iv == 0){
 9             $this->iv = $key;
10         }else{
11             $this->iv = $iv;
12         }
13     }
14     function encrypt($input) {
15         $size = mcrypt_get_block_size(‘des‘, ‘ecb‘);
16         $input = $this->pkcs5_pad($input, $size);
17         $td = mcrypt_module_open(‘des‘, ‘‘, ‘ecb‘, ‘‘);
18         $iv = @mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
19         @mcrypt_generic_init($td, $this->key, $iv);
20         $data = mcrypt_generic($td, $input);
21         mcrypt_generic_deinit($td);
22         mcrypt_module_close($td);
23         $data = base64_encode($data);
24         return $data;
25
26     }
27     function decrypt($encrypted) {
28         $encrypted = base64_decode($encrypted);
29         $td = mcrypt_module_open(‘des‘,‘‘,‘ecb‘,‘‘);
30         //使用MCRYPT_DES算法,cbc模式
31         $iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
32         $ks = mcrypt_enc_get_key_size($td);
33         $key = substr($this->key, 0, $ks);
34         $rs = @mcrypt_generic_init($td, $key, $iv);
35         //初始处理
36         $decrypted = mdecrypt_generic($td, $encrypted);
37         //解密
38         mcrypt_generic_deinit($td);
39         //结束
40         mcrypt_module_close($td);
41         $y=$this->pkcs5_unpad($decrypted);
42         return $y;
43     }
44     function pkcs5_pad ($text, $blocksize) {
45         $pad = $blocksize - (strlen($text) % $blocksize);
46         return $text . str_repeat(chr($pad), $pad);
47     }
48     function pkcs5_unpad($text) {
49         $pad = ord($text{strlen($text)-1});
50         if ($pad > strlen($text))
51             return false;
52         if (strspn($text, chr($pad), strlen($text) - $pad) != $pad)
53             return false;
54         return substr($text, 0, -1 * $pad);
55     }
56 }
57
58 $key = "123456789012345678901234567890123456";  //36位
59 $crypt = new DesEncrypt($key);
60 $str = "中国";
61 $mstr = $crypt->encrypt($str);
62 echo "密文:" . $mstr . "<br/>";
63
64 $str = $crypt->decrypt($mstr);
65 echo "明文:" . $str;

结果:

密文:Rm+8trB4CBQ=
明文:中国

Java代码

  1 package com.util;
  2 import java.security.Key;
  3 import java.security.SecureRandom;
  4
  5 import javax.crypto.Cipher;
  6 import javax.crypto.SecretKeyFactory;
  7 import javax.crypto.spec.DESKeySpec;
  8
  9 import org.apache.commons.codec.binary.Base64;
 10
 11 import com.util.DesEncrypt;
 12
 13 /**
 14  * 加密解密
 15  * @author bian
 16  * 2015 上午11:13:36
 17  */
 18 public class DesEncrypt {
 19     Key key;
 20     public DesEncrypt(String str) {
 21         try{
 22             String key = str;
 23             setKey(key);// 生成密匙
 24         }catch(Exception e){
 25
 26         }
 27     }
 28
 29     public DesEncrypt() {
 30         setKey("heimazhifuqw233344");
 31     }
 32
 33     /**
 34      * 根据参数生成KEY
 35      */
 36     public void setKey(String strKey) {
 37         try {
 38             SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
 39             this.key  = keyFactory.generateSecret(new DESKeySpec(strKey.getBytes("UTF8")));
 40         } catch (Exception e) {
 41             throw new RuntimeException(
 42                     "Error initializing SqlMap class. Cause: " + e);
 43         }
 44     }
 45
 46
 47     /**
 48      * 加密String明文输入,String密文输出
 49      */
 50     public String encrypt(String strMing) {
 51         byte[] byteMi = null;
 52         byte[] byteMing = null;
 53         String strMi = "";
 54         //BASE64Encoder base64en = new BASE64Encoder();
 55         try {
 56             byteMing = strMing.getBytes("UTF8");
 57             byteMi = this.getEncCode(byteMing);
 58             strMi = new String(Base64.encodeBase64(byteMi), "UTF8");
 59         } catch (Exception e) {
 60             throw new RuntimeException(
 61                     "Error initializing SqlMap class. Cause: " + e);
 62         } finally {
 63             //base64en = null;
 64             byteMing = null;
 65             byteMi = null;
 66         }
 67         return strMi;
 68     }
 69
 70     /**
 71      * 解密 以String密文输入,String明文输出
 72      *
 73      * @param strMi
 74      * @return
 75      */
 76     public String decrypt(String strMi) {
 77         ///BASE64Decoder base64De = new BASE64Decoder();
 78         byte[] byteMing = null;
 79         byte[] byteMi = null;
 80         String strMing = "";
 81         try {
 82             byteMi = Base64.decodeBase64(strMi);
 83             byteMing = this.getDesCode(byteMi);
 84             strMing = new String(byteMing, "UTF8");
 85         } catch (Exception e) {
 86             throw new RuntimeException(
 87                     "Error initializing SqlMap class. Cause: " + e);
 88         } finally {
 89             //base64De = null;
 90             byteMing = null;
 91             byteMi = null;
 92         }
 93         return strMing;
 94     }
 95
 96     /**
 97      * 加密以byte[]明文输入,byte[]密文输出
 98      *
 99      * @param byteS
100      * @return
101      */
102     private byte[] getEncCode(byte[] byteS) {
103         byte[] byteFina = null;
104         Cipher cipher;
105         try {
106             cipher = Cipher.getInstance("DES");
107             cipher.init(Cipher.ENCRYPT_MODE, key,SecureRandom.getInstance("SHA1PRNG"));
108             byteFina = cipher.doFinal(byteS);
109         } catch (Exception e) {
110             throw new RuntimeException(
111                     "Error initializing SqlMap class. Cause: " + e);
112         } finally {
113             cipher = null;
114         }
115         return byteFina;
116     }
117
118     /**
119      * 解密以byte[]密文输入,以byte[]明文输出
120      *
121      * @param byteD
122      * @return
123      */
124     private byte[] getDesCode(byte[] byteD) {
125         Cipher cipher;
126         byte[] byteFina = null;
127         try {
128             cipher = Cipher.getInstance("DES");
129             cipher.init(Cipher.DECRYPT_MODE, key,SecureRandom.getInstance("SHA1PRNG"));
130             byteFina = cipher.doFinal(byteD);
131         } catch (Exception e) {
132             throw new RuntimeException(
133                     "Error initializing SqlMap class. Cause: " + e);
134         } finally {
135             cipher = null;
136         }
137         return byteFina;
138     }
139
140
141
142     public static void main(String args[])  {
143         String key = "123456789012345678901234567890123456";//36位
144         String str = "中国";
145         DesEncrypt des = new DesEncrypt(key);
146
147         // DES加密
148         String mStr =   des.encrypt(str);
149         // DES解密
150         String deStr = des.decrypt(mStr);
151
152         System.out.println("密文:" + mStr);
153         System.out.println("明文:" + deStr);
154     }
155 }

结果:

密文:Rm+8trB4CBQ=
明文:中国
时间: 2024-11-08 21:16:24

Java和PHP加解密的相关文章

【转】 Java 进行 RSA 加解密时不得不考虑到的那些事儿

[转] Java 进行 RSA 加解密时不得不考虑到的那些事儿 1. 加密的系统不要具备解密的功能,否则 RSA 可能不太合适 公钥加密,私钥解密.加密的系统和解密的系统分开部署,加密的系统不应该同时具备解密的功能,这样即使黑客攻破了加密系统,他拿到的也只是一堆无法破解的密文数据.否则的话,你就要考虑你的场景是否有必要用 RSA 了. 2. 可以通过修改生成密钥的长度来调整密文长度 生成密文的长度等于密钥长度.密钥长度越大,生成密文的长度也就越大,加密的速度也就越慢,而密文也就越难被破解掉.著名

一个java的DES加解密类转换成C#

原文:一个java的DES加解密类转换成C# 一个java的des加密解密代码如下: //package com.visionsky.util; import java.security.*; //import java.util.regex.Pattern; //import java.util.Hashtable; import javax.crypto.*; import javax.crypto.spec.*; import sun.misc.*; /** * des加密解密 */ pu

Java 进行 RSA 加解密时不得不考虑到的那些事儿

1. 加密的系统不要具备解密的功能,否则 RSA 可能不太合适 公钥加密,私钥解密.加密的系统和解密的系统分开部署,加密的系统不应该同时具备解密的功能,这样即使黑客攻破了加密系统,他拿到的也只是一堆无法破解的密文数据.否则的话,你就要考虑你的场景是否有必要用 RSA 了. 2. 可以通过修改生成密钥的长度来调整密文长度 生成密文的长度等于密钥长度.密钥长度越大,生成密文的长度也就越大,加密的速度也就越慢,而密文也就越难被破解掉.著名的"安全和效率总是一把双刃剑"定律,在这里展现的淋漓尽

Java 进行 RSA 加解密的例子

加密是保证数据安全的手段之一.加密是将纯文本数据转换为难以理解的密文:解密是将密文转换回纯文本.数据的加解密属于密码学的范畴.通常,加密和解密都需要使用一些秘密信息,这些秘密信息叫做密钥,将纯文本转为密文或者转回的时候都要用到这些密钥.对称加密指的是发送者和接收者共用同一个密钥的加解密方法.非对称加密(又称公钥加密)指的是需要一个私有密钥一个公开密钥,两个不同的密钥的加解密体系.尽管不同,这个密钥对的这两个部分在算法上是有关联的.一个密钥将纯文本加密,另一个将密文解密.没有一个密钥能够把加密和加

Nodejs与Java通用AES加解密

一.nodejs加解密工具类: /** * AES util */ const CryptoJS = require('crypto-js') export const AES = { //加密 encode: (params) => { let { data, param, key } = params let result = JSON.parse(JSON.stringify(data)) param.forEach(ele => { let data = result[ele] key

JAVA AES文件加解密

AES加解密算法,代码如下: /** * Created by hua on 2017/6/30. */ import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; public class AESUtil1 { //初始化向量,aes 16位 private static final String IV = "abcdefghijk1m

java之BASE64加解密

1.简介 Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,采用Base64编码具有不可读性,即所编码的数据不会被人用肉眼所直接看到. 注:位于jdk的java.util包中. 2.代码 import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import java.io.UnsupportedEncodingException; /** * Created by root on 16-6-2. */ publ

java中RSA加解密的实现

今天在做RSA加密的时候遇到了一个这样的错误:ArrayIndexOutOfBoundsException: too much data for RSA block 查询相关资料后得知该错误是加密数据过长导致的. 加密数据长度 <= 模长-11 解决办法:将要加密的数据截取后分段加密 1.密钥长度rsa算法初始化的时候一般要填入密钥长度,在96-1024bits间(1)为啥下限是96bits(12bytes)?因为加密1byte的明文,需要至少1+11=12bytes的密钥(不懂?看下面的明文长

用Java实现RSA加解密及签名和验签(1)——.pem文件格式秘钥

一.***.pem文件格式的秘钥(获取秘钥:可通过文件读取内容或者直接打开文件复制内容),我这里是打开文件复制秘钥直接使用 1.准备秘钥对,通过openssl生成秘钥对,生成秘钥可参考:https://www.cnblogs.com/ouyanxia/p/12427955.html A_RSA_PRIVATE_KEY=-----BEGIN PRIVATE KEY-----MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDnPzYKf20JIza