加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

循规蹈矩学加密

发布时间:2019-06-25 11:21:10 所属栏目:建站 来源:张京
导读:还记得上初二的那年炎天,班里来了一个新同窗,他就住在我家扑面的楼里,于是我们一路上学下学,很快便成了最要好的伴侣。我们抉择发现一套隐秘的雷同方法,任何人看到都不行能猜到它的真实寄义。我们第一个想到的就是汉语拼音,但很显然光把一个句子酿成

接下来我们看看Java端的解密代码该怎样写:

  1. try { 
  2.     Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); 
  3.     cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec("这里是16字节密钥".getBytes(), "AES")); 
  4.     String plaintext = new String(cipher.doFinal(Base64.getDecoder().decode("这里是明文".getBytes())), "UTF-8"); 
  5.     System.out.println(plaintext); 
  6. } catch (Exception e) { 
  7.     System.out.println("解密堕落:" + e.toString()); 

留意这里我们用到的是PKCS5Padding,上面加密的时辰不是用的是pkcs7padding吗?怎么这里酿成5了呢?

我们先来相识一下什么是pkcs。pkcs的全称是Public Key Cryptography Standards(公钥加密尺度),这是RSA尝试室拟定的一系列的公钥暗码编译尺度,较量闻名的有pkcs1, pkcs5, pkcs7, pkcs8这四个,它们别离打点的是差异的内容。在这里我们只是用它来添补,以是我们只存眷pkcs5和pkcs7就够了。那么pkcs5和pkcs7有什么区别呢?着实在添补方面它们两个的算法是一样的,pkcs5是pkcs7的一个子集,区别在于pkcs5是8字节牢靠的,而pkcs7可所以1到255之间的恣意字节。但用在AES算法上,由于AES尺度划定块巨细必需是16字节可能24字节可能32字节,不行能用pkcs5的8字节,以是AES算法只能用pkcs7添补。可是因为java早期工程师犯的一个定名上的错误,他们把AES添补算法的名称设定为pkcs5,而现实实现中实现的是pkcs7,以是我们在java端开拓解密的时辰必要行使pkcs5。

AES-CBC

谈完了不安详的AES-ECB,我们来做一下相对安详一些的AES-CBC模式。

1. AES-CBC的Javascript加密

直接上代码:

  1. const cipher = forge.cipher.createCipher('AES-CBC', '这里是16字节密钥'); 
  2. cipher.start({ iv: '这里是16字节偏移量' }); 
  3. cipher.update(forge.util.createBuffer('这里是明文')); 
  4. cipher.finish(); 
  5. const result = forge.util.encode64(cipher.output.getBytes()); 

跟上面的AES-ECB差不多,独一区别只是在start函数里界说了一个iv。

2. AES-CBC的Java解密

下面是Java代码:

  1. try { 
  2.     Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
  3.     cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec("这里是16字节密钥".getBytes(), "AES"), new IvParameterSpec("这里是16字节偏移量".getBytes())); 
  4.     String plaintext = new String(cipher.doFinal(Base64.getDecoder().decode("这里是明文".getBytes())), "UTF-8"); 
  5.     System.out.println(plaintext); 
  6. } catch (Exception e) { 
  7.     System.out.println("解密堕落:" + e.toString()); 

也是同样,跟上面用AES-ECB时的模式险些千篇一律,只是增进了一个IvParameterSpec,用来天生iv,在cipher.init内里增进了一个iv参数,除此之外完全沟通,就这样我们就已经实现了一个简朴的CBC模式。

RSA

可是以上两种做法都明明长短常不安详的,由于我们把加密用的密钥和iv参数都直接袒露在了前端,为此我们必要一种越发安详的加密要领——RSA。由于RSA长短对称加密,纵然我们把加密用的公钥完全袒露在前端也不必担忧,别人纵然截获了我们的密文,但由于他们没有解密密钥,是无法解出我们的明文的。

1. 天生密钥对

要用RSA加密,起首我们必要天生一个公钥和一个私钥,我们可以直接执行呼吁ssh-keygen。它会问我们密钥文件生涯的文件夹,留意必然要单独找一个文件夹存放,不要放在缺省文件夹下,不然你一般行使的ssh公钥和私钥就都被包围了。

获得公钥文件之后,因为这个公钥文件是rfc4716名目标,而我们的forge库要求一个pkcs1名目标公钥,以是这里我们必要把它转换成pem名目(也就是pkcs1名目):

  1. ssh-keygen -f 公钥文件名 -m pem -e 

2. RSA的Javascript加密

获得pem名目标公钥之后,我们来看一下js的代码:

  1. forge.util.encode64(forge.pki.publicKeyFromPem('-----BEGIN RSA PUBLIC KEY-----MIIBCfdsafasfasfafsdaafdsaAB-----END RSA PUBLIC KEY-----').encrypt('这里是明文', 'RSA-OAEP', { md: forge.md.sha256.create(), mgf1: { md: forge.md.sha1.create() } }); 

一句话就完成整个加密进程了,这就是forge的强盛之处。

3. RSA的Java解密

接下来我们看解密。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读