轻光233
本帖最后由 轻光233 于 2019-6-6 10:33 编辑

最近在做远程管理的插件,其中牵扯到加密的技术
由于个人只是个初中生,并没有了解过什么加密算法
请问吧里有什么dalao知道双向加密的算法,务必教教我这个萌新qwq
(已解决,感谢3l和6l的dalao,之前我说base64是加密算法的说法也是极其错误的,在此道歉,也感谢7l的dalao的提醒)

森林蝙蝠
RSA/AES算法,非常常见

roj234
本帖最后由 roj234 于 2019-5-12 17:27 编辑
  1. import java.io.UnsupportedEncodingException;
  2. import java.security.InvalidKeyException;
  3. import java.security.NoSuchAlgorithmException;
  4. import java.security.SecureRandom;
  5. import javax.crypto.BadPaddingException;
  6. import javax.crypto.Cipher;
  7. import javax.crypto.IllegalBlockSizeException;
  8. import javax.crypto.KeyGenerator;
  9. import javax.crypto.NoSuchPaddingException;
  10. import javax.crypto.SecretKey;
  11. import javax.crypto.spec.SecretKeySpec;

  12. /**
  13. **
  14. * AES128 算法,加密模式为ECB,填充模式为 pkcs7(实际就是pkcs5)
  15. *
  16. *
  17. */
  18. public class AESUtil {

  19.     /**
  20.      * 加密
  21.      *
  22.      * @param content 需要加密的内容
  23.      * @param key  加密密码
  24.      * @return
  25.      */
  26.     public static byte[] encrypt(String content, String key) {
  27.         try {
  28.             KeyGenerator kgen = KeyGenerator.getInstance("AES");
  29.             SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
  30.             random.setSeed(key.getBytes());
  31.             kgen.init(128, random);
  32.             SecretKey secretKey = kgen.generateKey();
  33.             byte[] enCodeFormat = secretKey.getEncoded();
  34.             SecretKeySpec secretKeySpec = new SecretKeySpec(enCodeFormat, "AES");
  35.             Cipher cipher = Cipher.getInstance("AES");// 创建密码器
  36.             byte[] byteContent = content.getBytes("UTF-8");
  37.             cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);// 初始化
  38.             byte[] result = cipher.doFinal(byteContent);
  39.             return result; // 加密
  40.         } catch (NoSuchAlgorithmException e) {
  41.             e.printStackTrace();
  42.         } catch (NoSuchPaddingException e) {
  43.             e.printStackTrace();
  44.         } catch (InvalidKeyException e) {
  45.             e.printStackTrace();
  46.         } catch (UnsupportedEncodingException e) {
  47.             e.printStackTrace();
  48.         } catch (IllegalBlockSizeException e) {
  49.             e.printStackTrace();
  50.         } catch (BadPaddingException e) {
  51.             e.printStackTrace();
  52.         }
  53.         return null;
  54.     }

  55.     /**解密
  56.      * @param content  待解密内容
  57.      * @param key 解密密钥
  58.      * @return
  59.      */
  60.     public static byte[] decrypt(byte[] content, String key) {
  61.         try {
  62.             KeyGenerator kgen = KeyGenerator.getInstance("AES");
  63.             SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
  64.             random.setSeed(key.getBytes());
  65.             kgen.init(128, random);
  66.             SecretKey secretKey = kgen.generateKey();
  67.             byte[] enCodeFormat = secretKey.getEncoded();
  68.             SecretKeySpec secretKeySpec = new SecretKeySpec(enCodeFormat, "AES");
  69.             Cipher cipher = Cipher.getInstance("AES");// 创建密码器
  70.             cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);// 初始化
  71.             byte[] result = cipher.doFinal(content);
  72.             return result; // 加密
  73.         }catch (NoSuchAlgorithmException e) {
  74.             //e.printStackTrace();
  75.         } catch (NoSuchPaddingException e) {
  76.             //e.printStackTrace();
  77.         } catch (InvalidKeyException e) {
  78.             //e.printStackTrace();
  79.         } catch (IllegalBlockSizeException e) {
  80.             //e.printStackTrace();
  81.         } catch (BadPaddingException e) {
  82.             //e.printStackTrace();
  83.         }
  84.         return null;
  85.     }

  86.     /**
  87.      * 字符串加密
  88.      * @param content 要加密的字符串
  89.      * @param key 加密的AES Key
  90.      * @return
  91.      */
  92.     public static String encryptString(String content, String key) {
  93.         return parseByte2HexStr( encrypt(content, key));
  94.     }

  95.     /**
  96.      * 字符串解密
  97.      * @param content 要解密的字符串
  98.      * @param key 解密的AES Key
  99.      * @return
  100.      */
  101.     public static String decryptString(String content, String key){
  102.         byte[] decryptFrom = parseHexStr2Byte(content);
  103.         byte[] decryptResult = decrypt(decryptFrom,key);
  104.         return new String(decryptResult);
  105.     }


  106.     /**将16进制转换为二进制
  107.      * @param hexStr
  108.      * @return
  109.      */
  110.     public static byte[] parseHexStr2Byte(String hexStr) {
  111.         if (hexStr.length() < 1)
  112.             return null;
  113.         byte[] result = new byte[hexStr.length()/2];
  114.         for (int i = 0;i< hexStr.length()/2; i++) {
  115.             int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16);
  116.             int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16);
  117.             result[i] = (byte) (high * 16 + low);
  118.         }
  119.         return result;
  120.     }


  121.     /**将二进制转换成16进制
  122.      * @param buf
  123.      * @return
  124.      */
  125.     public static String parseByte2HexStr(byte buf[]) {
  126.         StringBuffer sb = new StringBuffer();
  127.         for (int i = 0; i < buf.length; i++) {
  128.             String hex = Integer.toHexString(buf[i] & 0xFF);
  129.             if (hex.length() == 1) {
  130.                 hex = '0' + hex;
  131.             }
  132.             sb.append(hex.toUpperCase());
  133.         }
  134.         return sb.toString();
  135.     }
  136. }</i></i>
复制代码


Ariy
本帖最后由 tian_wc 于 2019-5-12 18:32 编辑


具体怎么用建议百度,node和java都有现成的包可以用
非对称、双向,很符合你的要求



gooding300
建议先了解一下不对称加密
https://www.zhihu.com/question/33645891

萝娜娜
本帖最后由 lona 于 2019-5-13 16:09 编辑

1.这里不是贴吧2.你需要使用的是AES+RSA
3.AES-对称加密(速度较快
4.RSA-非对称加密(速度较慢
5.AES的实现在openssl,mbedtls等广泛使用的库均有实现,同时现在的部分CPU也支持AES

    mbedtls
    aes指令集
6.RSA的实现同样在openssl和mbedtls中有实现,但是没有CPU支持
    openssl
7.如果你是期待的java示例代码,那就更简单了
    rsa
    aes

Lss233
楼上各位大佬已经介绍的很详细了。但是看了楼主的帖子,我还是忍不住想补充一点:
BASE64不是加密算法!不是加密算法!它不是!!!

加密算法的要求是需要通过一个特殊的密钥来解密,才能获取到原来的内容,
但是,根据英文维基百科的介绍,base64只是一种数据编码算法,它能做到的,就是把一串数据用另外一种方式6KGo6L6+5Ye65p2l而已,任何人只要知道是这种算法处理过的数据,就可以直接得到原来的数据。
base64是加密算法”是极具误导性的错误说法。

相关链接:
https://en.m.wikipedia.org/wiki/Base64

https://stackoverflow.com/questi ... -encoding-algorithm

第一页 上一页 下一页 最后一页