北京华夏安泰技术论坛

 找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需要一步,快速开始

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 434|回复: 2

加解密相关

[复制链接]

12

主题

86

帖子

371

积分

内部工作人员

积分
371
发表于 2017-9-4 16:41:47 | 显示全部楼层 |阅读模式
占位!!!!!!!!!!!!!!!!!!!!!!!!
回复

使用道具 举报

12

主题

86

帖子

371

积分

内部工作人员

积分
371
 楼主| 发表于 2017-9-4 16:43:11 | 显示全部楼层
MD5的salt以及多次hash

  1. package bubble.crypto;

  2. import org.apache.commons.codec.DecoderException;
  3. import org.apache.commons.codec.binary.Hex;

  4. import java.io.UnsupportedEncodingException;
  5. import java.security.MessageDigest;
  6. import java.security.NoSuchAlgorithmException;
  7. import java.security.SecureRandom;
  8. import java.util.Arrays;

  9. /**
  10. * @since 2017-09-04
  11. */
  12. public class MD5 {

  13.     private MD5(Builder builder) {
  14.         this.saltLength = builder.saltLength;
  15.         this.hashTimes = builder.hashTimes;
  16.     }

  17.     private int saltLength = 0;

  18.     private int hashTimes = 1;

  19.     public static class Builder {

  20.         private int saltLength = 0;

  21.         private int hashTimes = 1;

  22.         public Builder saltLength(int length) {
  23.             this.saltLength = length;
  24.             return this;
  25.         }

  26.         public Builder hashTimes(int times) {
  27.             this.hashTimes = times;
  28.             return this;
  29.         }

  30.         public MD5 build() {
  31.             return new MD5(this);
  32.         }
  33.     }

  34.     private byte[] execute(byte[] bytes, byte[] salt) throws NoSuchAlgorithmException {
  35.         MessageDigest md = MessageDigest.getInstance("MD5");
  36.         if (salt.length > 0) {
  37.             md.update(salt);
  38.         }

  39.         byte[] digest = bytes;
  40.         for (int i = 0; i < hashTimes; i++) {
  41.             md.update(digest);
  42.             digest = md.digest();
  43.         }

  44.         if (saltLength > 0) {
  45.             byte[] result = new byte[digest.length + saltLength];
  46.             System.arraycopy(salt, 0, result, 0, saltLength);
  47.             System.arraycopy(digest, 0, result, saltLength, digest.length);
  48.             return result;
  49.         }

  50.         return digest;
  51.     }

  52.     public byte[] digest(byte[] bytes) throws NoSuchAlgorithmException {
  53.         SecureRandom random = new SecureRandom();

  54.         byte[] salt = new byte[saltLength];
  55.         if (saltLength > 0) {
  56.             random.nextBytes(salt);
  57.         }

  58.         return execute(bytes, salt);
  59.     }

  60.     public byte[] digest(String text) throws NoSuchAlgorithmException, UnsupportedEncodingException {
  61.         return digest(text.getBytes("utf-8"));
  62.     }

  63.     public boolean validate(byte[] text, byte[] digest) throws NoSuchAlgorithmException {
  64.         byte[] salt = new byte[saltLength];
  65.         System.arraycopy(digest, 0, salt, 0, saltLength);
  66.         return Arrays.equals(digest, execute(text, salt));
  67.     }

  68.     public boolean validate(String text, String digest) throws UnsupportedEncodingException, NoSuchAlgorithmException {
  69.         return validate(text.getBytes("utf-8"), digest.getBytes("utf-8"));
  70.     }

  71.     public static void main(String[] args) throws UnsupportedEncodingException, NoSuchAlgorithmException, DecoderException {
  72.         MD5 md5 = new Builder().hashTimes(2).saltLength(8).build();
  73.         byte[] digest = md5.digest("abc123");
  74.         String hex = new String(Hex.encodeHex(digest));
  75.         System.out.println(new String(digest));
  76.         System.out.println(hex);
  77.         System.out.println(new String(Hex.decodeHex(hex.toCharArray())));

  78.         System.out.println(md5.validate("abc我".getBytes(), Hex.decodeHex("2600d9802ae54c0ac182edeb7814daabf45da566333b82eb".toCharArray())));
  79.     }
  80. }
复制代码


回复

使用道具 举报

12

主题

86

帖子

371

积分

内部工作人员

积分
371
 楼主| 发表于 2017-9-4 16:51:57 | 显示全部楼层
RSA加解密(kotlin代码)
  1. package lark.crypto

  2. import org.apache.commons.codec.binary.Hex
  3. import java.security.KeyPair
  4. import java.security.KeyPairGenerator
  5. import java.security.SecureRandom
  6. import java.util.*
  7. import javax.crypto.Cipher

  8. /**
  9. * @since 2017-09-01
  10. */
  11. class RSA private constructor(val mode: Mode, val bytes: ByteArray, val key: java.security.Key, val strength: Int) {

  12.     private constructor(builder: Builder) : this(builder.mode, builder.bytes, builder.key, builder.strength!!)

  13.     companion object {
  14.         val algorithm: String = "RSA"
  15.         fun build(init: Builder.() -> Unit) = Builder(init).build()
  16.     }

  17.     enum class Mode {
  18.         ENCRYPT, DECRYPT
  19.     }

  20.     class Builder private constructor() {
  21.         constructor(init: Builder.() -> Unit) : this() {
  22.             init()
  23.         }

  24.         var strength: Int? = null

  25.         lateinit var mode: Mode

  26.         lateinit var key: java.security.Key

  27.         lateinit var bytes: ByteArray

  28.         fun build() = RSA(this)
  29.     }

  30.     private fun execute(): ByteArray {

  31.         val cipher = Cipher.getInstance(algorithm)
  32.         cipher.init(if (mode == Mode.ENCRYPT) Cipher.ENCRYPT_MODE else Cipher.DECRYPT_MODE, key)

  33.         // 计算加密模式下支持的最大加密字节数 或 解密模式下密文块大小
  34.         val size: Int = if (mode == Mode.ENCRYPT) strength / 8 - 11 else strength / 8

  35.         if (bytes.size > size) {
  36.             // 当处于加密模式下,要加密的字节数超过最大支持数,按最大支持的字节数进行分块加密;

  37.             // 当处于加密模式下,正常情况密文字节数是一个仅仅和密钥相关的固定数值,
  38.             // 但如果加密过程中进行了分块加密,在解密时同样要进行分块解密。
  39.             var offset = 0
  40.             var result = ByteArray(0)
  41.             while (offset < bytes.size) {
  42.                 var to = offset + size
  43.                 if (to > bytes.size) to = bytes.size

  44.                 val tmpBytes = cipher.doFinal(bytes.copyOfRange(offset, to))
  45.                 val position = result.size

  46.                 result = Arrays.copyOf(result, result.size + tmpBytes.size)
  47.                 System.arraycopy(tmpBytes, 0, result, position, tmpBytes.size)

  48.                 offset += size
  49.             }

  50.             return result
  51.         } else {
  52.             // 要加密的字节数未超过最大支持数,直接加密
  53.             // 密文不是分块加密,直接解密
  54.             return cipher.doFinal(bytes)
  55.         }
  56.     }

  57.     fun encrypt(): ByteArray {
  58.         return execute()
  59.     }

  60.     fun decrypt(): ByteArray {
  61.         return execute()
  62.     }

  63.     class Key(val size: Int) {
  64.         val pair: KeyPair by lazy {
  65.             val generator = KeyPairGenerator.getInstance(algorithm)
  66.             generator.initialize(size, SecureRandom())
  67.             generator.generateKeyPair()
  68.         }

  69.         val private: java.security.Key by lazy {
  70.             pair.private
  71.         }

  72.         val public: java.security.Key by lazy {
  73.             pair.public
  74.         }
  75.     }
  76. }

  77. fun main(args: Array<String>) {
  78.     val pair = RSA.Key(2048)

  79.     val license = """
  80.         >{
  81.         >    "name": "山东烟台交通局",
  82.         >    "expire": "2017-08-15"
  83.         >}
  84.     """.trimMargin(">")

  85.     var cipherBytes = RSA.build {
  86.         mode = RSA.Mode.ENCRYPT
  87.         key = pair.private
  88.         strength = 2048
  89.         bytes = license.toByteArray()
  90.     }.encrypt()

  91.     println("加密后长度:${cipherBytes.size},加密结果:${String(cipherBytes)}")

  92.     var cipherHex = Hex.encodeHexString(cipherBytes)
  93.     println("转Hex后长度:${cipherHex.length},转换结果:${cipherHex}")

  94.     var plainBytes = RSA.build {
  95.         mode = RSA.Mode.DECRYPT
  96.         key = pair.public
  97.         strength = 2048
  98.         bytes = cipherBytes
  99.     }.decrypt()
  100.     println(String(plainBytes))



  101.     fun html(init: () -> Unit) {
  102.         init()
  103.     }

  104.     html {
  105.         println("hello html")
  106.     }
  107. }
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册  

本版积分规则


小黑屋|手机版|Archiver|北京华夏安泰技术论坛  

GMT+8, 2019-4-19 02:18 , Processed in 0.328123 second(s), 31 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表