关于rsaaesjava的信息
本篇文章给大家谈谈rsaaesjava,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、RSA公钥和私钥的生成以及PKCS#1与PKCE#8格式的转换
- 2、Java加密和数字签名
- 3、JAVA里面RSA加密算法的使用
- 4、java aes加密与网上在线加密不同。谁能告诉我为什么?求个正确的例子,谢谢了!
RSA公钥和私钥的生成以及PKCS#1与PKCE#8格式的转换
首先需要电脑安装openssl,这个搜一下安装就行了。
然后运行命令行输入命令:
回车,可以看到命令行执行的文件夹多了一个rsa_private_key.pem私钥文件
然后执行生成公钥命令:
回车,可以看到命令行执行的文件夹多了一个rsa_public_key.pem公钥文件
PKCS#1格式私钥转换成PKCS#8格式私钥(一般JAVA用的都是PKCS#8格式私钥)
回车,可以看到命令行打印出了PKCS#8格式的私钥,右键复制就行了。
用记事本开打密钥文件看看
以-----BEGIN RSA PRIVATE KEY-----开头
以-----END RSA PRIVATE KEY-----结束
的就是PKCS#1格式
以-----BEGIN PRIVATE KEY-----开头
以-----END PRIVATE KEY-----结束
的就是PKCS#8格式
最后附上pyhton和java语言实现RSA和AES加密的文章:
python实现RSA与AES混合加密
java实现RSA与AES混合加密
python,java跨语言RSA+AES混合加密解密以及踩过的那些坑
Java加密和数字签名
Java加密和数字签名本文主要谈一下密码学中的加密和数字签名 以及其在java中如何进行使用 对密码学有兴趣的伙伴 推荐看 Bruce Schneier的著作 Applied Crypotography 在jdk 的发行版本中安全性方面有了很大的改进 也提供了对RSA算法的直接支持 现在我们从实例入手解决问题(本文仅是作为简单介绍)
一 密码学上常用的概念
)消息摘要
这是一种与消息认证码结合使用以确保消息完整性的技术 主要使用单向散列函数算法 可用于检验消息的完整性 和通过散列密码直接以文本形式保存等 目前广泛使用的算法有MD MD SHA jdk 对上面都提供了支持 在java中进行消息摘要很简单 java security MessageDigest提供了一个简易的操作方法
/** *MessageDigestExample java *Copyright */ import java security MessageDigest; /** *单一的消息摘要算法 不使用密码 可以用来对明文消息(如 密码)隐藏保存 */ public class MessageDigestExample{ public static void main(String[] args) throws Exception{ if(args length!= ){ System err println( Usage:java MessageDigestExample text ); System exit( ); }
byte[] plainText=args[ ] getBytes( UTF );
//使用getInstance( 算法 )来获得消息摘要 这里使用SHA 的 位算法 MessageDigest messageDigest=MessageDigest getInstance( SHA );
System out println( \n +messageDigest getProvider() getInfo()); //开始使用算法 messageDigest update(plainText); System out println( \nDigest: ); //输出算法运算结果 System out println(new String(messageDigest digest() UTF )); } } 还可以通过消息认证码来进行加密实现 javax crypto Mac提供了一个解决方案 有兴趣者可以参考相关API文档 本文只是简单介绍什么是摘要算法
这里补充另一个运用消息摘要的方式加密的例子: public class TestEncrypt {
public TestEncrypt() { }
/** * @param strSrc :strSrc is a string will be encrypted * @param encName : encName is the algorithm name will be used * encName dafault to MD * @return String */ public String Encrypt(String strSrc String encName) {
MessageDigest md = null; String strDes = null;
byte[] bt = strSrc getBytes(); try { if (encName == null || encName equals( )) { encName = MD ; } md = MessageDigest getInstance(encName); md update(bt); strDes = bytes Hex(md digest()); //to HexString } catch (NoSuchAlgorithmException e) { System out println( Invalid algorithm ); return null; } return strDes; }
public String bytes Hex(byte[] bts) { String des = ; String tmp = null; for (int i = ; i bts length; i++) { tmp = (Integer toHexString(bts[i] xFF)); if (tmp length() == ) { des += ; } des += tmp; } return des; }
public static void main(String[]args) { TestEncrypt te = new TestEncrypt(); String strSrc = 可以加密汉字 Oh and english ; System out println( Source String: + strSrc); System out println( Encrypted String: ); System out println( Use Def: + te Encrypt(strSrc null)); System out println( Use MD : + te Encrypt(strSrc MD )); System out println( Use SHA: + te Encrypt(strSrc SHA )); System out println( Use SHA : + te Encrypt(strSrc SHA )); } }
另外 在javawebparts中的 RequestHelpers里的generateGUID方法也涉及到了MD 的方法 代码如下: public static String generateGUID(HttpServletRequest request) {
String out = ; try { // Construct a string that is prised of: // Remote IP Address + Host IP Address + Date (yyyyMMdd) + // Time (hhmmssSSa) + Requested Path + Session ID + // HashCode Of ParameterMap StringBuffer *** = new StringBuffer( ); *** append(request getRemoteAddr()); InetAddress ia = InetAddress getLocalHost(); *** append(ia getHostAddress()); *** append(new SimpleDateFormat( yyyyMMddhhmmssSSa ) format(new Date())); String path = request getServletPath(); String pathInfo = request getPathInfo(); if (pathInfo != null) { path += pathInfo; } *** append(path); *** append(request getSession(false)); *** append(request getParameterMap() hashCode()); String str = *** toString(); // Now encode the string using an MD encryption algorithm MessageDigest md = MessageDigest getInstance( md ); md update(str getBytes()); byte[] digest = md digest(); StringBuffer hexStr = new StringBuffer( ); for (int i = ; i digest length; i++) { str = Integer toHexString( xFF digest[i]); if (str length() ) { str = + str; } hexStr append(str); } out = hexStr toString(); } catch (NoSuchAlgorithmException nsae) { log error(nsae); } catch (UnknownHostException uhe) { log error(uhe); } // Return the encrypted string It should be unique based on the // ponents that prise the plain text string and should always be // characters thanks to the MD algorithm return out;
} // End generateGUID()
)私钥加密
消息摘要只能检查消息的完整性 但是单向的 对明文消息并不能加密 要加密明文的消息的话 就要使用其他的算法 要确保机密性 我们需要使用私钥密码术来交换私有消息
这种最好理解 使用对称算法 比如 A用一个密钥对一个文件加密 而B读取这个文件的话 则需要和A一样的密钥 双方共享一个私钥(而在web环境下 私钥在传递时容易被侦听)
使用私钥加密的话 首先需要一个密钥 可用javax crypto KeyGenerator产生一个密钥(java security Key) 然后传递给一个加密工具(javax crypto Cipher) 该工具再使用相应的算法来进行加密 主要对称算法有 DES(实际密钥只用到 位) AES(支持三种密钥长度 位) 通常首先 位 其他的还有DESede等 jdk 种也提供了对对称算法的支持 以下例子使用AES算法来加密
/** *PrivateExmaple java *Copyright */ import javax crypto Cipher; import javax crypto KeyGenerator; import java security Key;
/** *私鈅加密 保证消息机密性 */ public class PrivateExample{ public static void main(String[] args) throws Exception{ if(args length!= ){ System err println( Usage:java PrivateExample text ); System exit( ); } byte[] plainText=args[ ] getBytes( UTF );
//通过KeyGenerator形成一个key System out println( \nStart generate AES key ); KeyGenerator keyGen=KeyGenerator getInstance( AES ); keyGen init( ); Key key=keyGen generateKey(); System out println( Finish generating DES key );
//获得一个私鈅加密类Cipher ECB是加密方式 PKCS Padding是填充方法 Cipher cipher=Cipher getInstance( AES/ECB/PKCS Padding ); System out println( \n +cipher getProvider() getInfo());
//使用私鈅加密 System out println( \nStart encryption: ); cipher init(Cipher ENCRYPT_MODE key); byte[] cipherText=cipher doFinal(plainText); System out println( Finish encryption: ); System out println(new String(cipherText UTF ));
System out println( \nStart decryption: ); cipher init(Cipher DECRYPT_MODE key); byte[] newPlainText=cipher doFinal(cipherText); System out println( Finish decryption: );
System out println(new String(newPlainText UTF ));
} }
)公钥加密
上面提到 私钥加密需要一个共享的密钥 那么如何传递密钥呢?web环境下 直接传递的话很容易被侦听到 幸好有了公钥加密的出现 公钥加密也叫不对称加密 不对称算法使用一对密钥对 一个公钥 一个私钥 使用公钥加密的数据 只有私钥能解开(可用于加密) 同时 使用私钥加密的数据 只有公钥能解开(签名) 但是速度很慢(比私钥加密慢 到 倍) 公钥的主要算法有RSA 还包括Blowfish Diffie Helman等 jdk 种提供了对RSA的支持 是一个改进的地方
/** *PublicExample java *Copyright */ import java security Key; import javax crypto Cipher; import java security KeyPairGenerator; import java security KeyPair; /** *一个简单的公鈅加密例子 Cipher类使用KeyPairGenerator生成的公鈅和私鈅 */ public class PublicExample{ public static void main(String[] args) throws Exception{ if(args length!= ){ System err println( Usage:java PublicExample text ); System exit( ); }
byte[] plainText=args[ ] getBytes( UTF ); //构成一个RSA密钥 System out println( \nStart generating RSA key ); KeyPairGenerator keyGen=KeyPairGenerator getInstance( RSA ); keyGen initialize( ); KeyPair key=keyGen generateKeyPair(); System out println( Finish generating RSA key );
//获得一个RSA的Cipher类 使用公鈅加密 Cipher cipher=Cipher getInstance( RSA/ECB/PKCS Padding ); System out println( \n +cipher getProvider() getInfo());
System out println( \nStart encryption ); cipher init(Cipher ENCRYPT_MODE key getPublic()); byte[] cipherText=cipher doFinal(plainText); System out println( Finish encryption: ); System out println(new String(cipherText UTF ));
lishixinzhi/Article/program/Java/hx/201311/26898
JAVA里面RSA加密算法的使用
RSA的Java实现不能一次加密很大的字符,自己处理了一下,见下面的代码。Base64编码类用的是一个Public domain Base64 for java 其他的保存公钥到文件等简单的实现,就不详细说了,看代码吧。==============================================import java.security.*;import java.security.spec.PKCS8EncodedKeySpec;import java.security.spec.X509EncodedKeySpec;import java.util.HashMap;import java.util.Map;import javax.crypto.*;import java.io.*;public class Encryptor {private static final String KEY_FILENAME = "c:\\mykey.dat";private static final String OTHERS_KEY_FILENAME = "c:\\Otherskey.dat";// private static final int KEY_SIZE = 1024;// private static final int BLOCK_SIZE = 117;// private static final int OUTPUT_BLOCK_SIZE = 128;private static final int KEY_SIZE = 2048; //RSA key 是多少位的private static final int BLOCK_SIZE = 245; //一次RSA加密操作所允许的最大长度//这个值与 KEY_SIZE 已经padding方法有关。因为 1024的key的输出是128,2048key输出是256字节//可能11个字节用于保存padding信息了,所以最多可用的就只有245字节了。private static final int OUTPUT_BLOCK_SIZE = 256;private SecureRandom secrand;private Cipher rsaCipher;private KeyPair keys;private MapString, Key allUserKeys;public Encryptor() throws Exception {try {allUserKeys = new HashMapString, Key();secrand = new SecureRandom();//SunJCE Provider 中只支持ECB mode,试了一下只有PKCS1PADDING可以直接还原原始数据,//NOPadding导致解压出来的都是blocksize长度的数据,还要自己处理//参见 另外根据 Open-JDK-6.b17-src( )// 中代码的注释,使用RSA来加密大量数据不是一种标准的用法。所以现有实现一次doFinal调用之进行一个RSA操作,//如果用doFinal来加密超过的一个操作所允许的长度数据将抛出异常。//根据keysize的长度,典型的1024个长度的key和PKCS1PADDING一起使用时//一次doFinal调用只能加密117个byte的数据。(NOPadding 和1024 keysize时128个字节长度)//(2048长度的key和PKCS1PADDING 最多允许245字节一次)//想用来加密大量数据的只能自己用其他办法实现了。可能RSA加密速度比较慢吧,要用AES才行rsaCipher = Cipher.getInstance("RSA/ECB/PKCS1PADDING");} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (NoSuchPaddingException e) {e.printStackTrace();throw e;}ObjectInputStream in;try {in = new ObjectInputStream(new FileInputStream(KEY_FILENAME));} catch (FileNotFoundException e) {if (false == GenerateKeys()){throw e;}LoadKeys();return;}keys = (KeyPair) in.readObject();in.close();LoadKeys();}/** 生成自己的公钥和私钥*/private Boolean GenerateKeys() {try {KeyPairGenerator keygen = KeyPairGenerator.getInstance("RSA");// secrand = new SecureRandom();// sedSeed之后会造成 生成的密钥都是一样的// secrand.setSeed("chatencrptor".getBytes()); // 初始化随机产生器//key长度至少512长度,不过好像说现在用2048才算比较安全的了keygen.initialize(KEY_SIZE, secrand); // 初始化密钥生成器keys = keygen.generateKeyPair(); // 生成密钥组AddKey("me", EncodeKey(keys.getPublic()));} catch (NoSuchAlgorithmException e) {e.printStackTrace();return false;}ObjectOutputStream out;try {out = new ObjectOutputStream(new FileOutputStream(KEY_FILENAME));} catch (IOException e) {e.printStackTrace();return false;}try {out.writeObject(keys);} catch (IOException e) {e.printStackTrace();return false;} finally {try {out.close();} catch (IOException e) {e.printStackTrace();return false;}}return true;}public String EncryptMessage(String toUser, String Message) throws IOException {Key pubkey = allUserKeys.get(toUser);if ( pubkey == null ){throw new IOException("NoKeyForThisUser") ;}try {//PublicKey pubkey = keys.getPublic();rsaCipher.init(Cipher.ENCRYPT_MODE, pubkey, secrand);//System.out.println(rsaCipher.getBlockSize()); 返回0,非block 加密算法来的?//System.out.println(Message.getBytes("utf-8").length);//byte[] encryptedData = rsaCipher.doFinal(Message.getBytes("utf-8"));byte[] data = Message.getBytes("utf-8");int blocks = data.length / BLOCK_SIZE ;int lastBlockSize = data.length % BLOCK_SIZE ;byte [] encryptedData = new byte[ (lastBlockSize == 0 ? blocks : blocks + 1)* OUTPUT_BLOCK_SIZE];for (int i=0; i blocks; i++){//int thisBlockSize = ( i + 1 ) * BLOCK_SIZE data.length ? data.length - i * BLOCK_SIZE : BLOCK_SIZE ;rsaCipher.doFinal(data,i * BLOCK_SIZE, BLOCK_SIZE, encryptedData ,i * OUTPUT_BLOCK_SIZE);}if (lastBlockSize != 0 ){rsaCipher.doFinal(data, blocks * BLOCK_SIZE, lastBlockSize,encryptedData ,blocks * OUTPUT_BLOCK_SIZE);}//System.out.println(encrypted.length); 如果要机密的数据不足128/256字节,加密后补全成为变为256长度的。//数量比较小时,Base64.GZIP产生的长度更长,没什么优势//System.out.println(Base64.encodeBytes(encrypted,Base64.GZIP).length());//System.out.println(Base64.encodeBytes(encrypted).length());//System.out.println (rsaCipher.getOutputSize(30));//这个getOutputSize 只对 输入小于最大的block时才能得到正确的结果。其实就是补全 数据为128/256 字节return Base64.encodeBytes(encryptedData);} catch (InvalidKeyException e) {e.printStackTrace();throw new IOException("InvalidKey") ;}catch (ShortBufferException e) {e.printStackTrace();throw new IOException("ShortBuffer") ;}catch (UnsupportedEncodingException e) {e.printStackTrace();throw new IOException("UnsupportedEncoding") ;} catch (IllegalBlockSizeException e) {e.printStackTrace();throw new IOException("IllegalBlockSize") ;} catch (BadPaddingException e) {e.printStackTrace();throw new IOException("BadPadding") ;}finally {//catch 中 return 或者throw之前都会先调用一下这里}}public String DecryptMessage(String Message) throws IOException {byte[] decoded = Base64.decode(Message);PrivateKey prikey = keys.getPrivate();try {rsaCipher.init(Cipher.DECRYPT_MODE, prikey, secrand);int blocks = decoded.length / OUTPUT_BLOCK_SIZE;ByteArrayOutputStream decodedStream = new ByteArrayOutputStream(decoded.length);for (int i =0 ;i blocks ; i ++ ){decodedStream.write (rsaCipher.doFinal(decoded,i * OUTPUT_BLOCK_SIZE, OUTPUT_BLOCK_SIZE));}return new String(decodedStream.toByteArray(), "UTF-8");} catch (InvalidKeyException e) {e.printStackTrace();throw new IOException("InvalidKey");} catch (UnsupportedEncodingException e) {e.printStackTrace();throw new IOException("UnsupportedEncoding");} catch (IllegalBlockSizeException e) {e.printStackTrace();throw new IOException("IllegalBlockSize");} catch (BadPaddingException e) {e.printStackTrace();throw new IOException("BadPadding");} finally {// catch 中 return 或者throw之前都会先调用一下这里。}}public boolean AddKey(String user, String key) {PublicKey publickey;try {publickey = DecodePublicKey(key);} catch (Exception e) {return false;}allUserKeys.put(user, publickey);SaveKeys();return true;}private boolean LoadKeys() {BufferedReader input;try {input = new BufferedReader(new InputStreamReader(new FileInputStream(OTHERS_KEY_FILENAME)));} catch (FileNotFoundException e1) {// e1.printStackTrace();return false;}
java aes加密与网上在线加密不同。谁能告诉我为什么?求个正确的例子,谢谢了!
Cipher.getInstance("AES/ECB/PKCS5Padding");
就是这个东西有很多标准的,你得看下线上用的是什么标准
AES/CBC/NoPadding (128)
AES/CBC/PKCS5Padding (128)
AES/ECB/NoPadding (128)
AES/ECB/PKCS5Padding (128)
DES/CBC/NoPadding (56)
DES/CBC/PKCS5Padding (56)
DES/ECB/NoPadding (56)
DES/ECB/PKCS5Padding (56)
DESede/CBC/NoPadding (168)
DESede/CBC/PKCS5Padding (168)
DESede/ECB/NoPadding (168)
DESede/ECB/PKCS5Padding (168)
RSA/ECB/PKCS1Padding (1024, 2048)
RSA/ECB/OAEPWithSHA-1AndMGF1Padding (1024, 2048)
RSA/ECB/OAEPWithSHA-256AndMGF1Padding (1024, 2048)
rsaaesjava的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于、rsaaesjava的信息别忘了在本站进行查找喔。
发布于:2022-12-28,除非注明,否则均为
原创文章,转载请注明出处。