admin管理员组文章数量:1794759
国产加密算法SM4实现(Java)
最近的项目需要用到SM4算法来进行加密和解密,所以研究了一下记录在下:
一.SM4简介:SM4是一种我国采用的一种分组密码标准,由国家密码局由2012年发布。
分组加密(英语:Block cipher),又称分块加密或块密码,是一种对称密钥算法。它将明文分成多个等长的模块(block),使用确定的算法和对称密钥对每组分别加密解密。分组加密是极其重要的加密协议组成,其中典型的如DES和AES作为美国政府核定的标准加密算法,应用领域从电子邮件加密到银行交易转帐,非常广泛。
国密即国家密码局认定的国产密码算法。主要有SM1,SM2,SM3,SM4。密钥长度和分组长度均为128位。
SM1为对称加密。其加密强度与AES相当。该算法不公开,调用该算法时,需要通过加密芯片的接口进行调用。
SM2为非对称加密,基于ECC。该算法已公开。由于该算法基于ECC,故其签名速度与秘钥生成速度都快于RSA。ECC 256位(SM2采用的就是ECC 256位的一种)安全强度比RSA 2048位高,但运算速度快于RSA。
SM3消摘要。可以用MD5作为对比理解。该算法已公开。校验结果为256位。
SM4无线局域网标准的分组数据算法。对称加密,密钥长度和分组长度均为128位。
上述可以总结为:SM4是一种过长加密算法。采用分组加密,对称加密。密钥长度和分组长度均为128位。
二.SM4的原理参考blog.csdn/weixin_37569048/article/details/94983841
三.Java实现SM4加密解密代码演示如下,可以直接使用
public String encrypt(String plainText, String secretKey) { try { SM4_Context ctx = new SM4_Context(); ctx.isPadding = true; ctx.mode = SM4.SM4_ENCRYPT; byte[] keyBytes; keyBytes = secretKey.getBytes(); SM4 sm4 = new SM4(); sm4.sm4_setkey_enc(ctx, keyBytes); byte[] encrypted = sm4.sm4_crypt_ecb(ctx, plainText.getBytes(CHARSET)); String cipherText = Base64.encodeBase64String(encrypted); if (cipherText != null && cipherText.trim().length() > 0) { Pattern p = Patternpile("\\\\s*|\\t|\\r|\\n"); Matcher m = p.matcher(cipherText); cipherText = m.replaceAll(""); } return cipherText; } catch (Exception e) { e.printStackTrace(); return null; } } public String decrypt(String cipherText, String secretKey) { try { SM4_Context ctx = new SM4_Context(); ctx.isPadding = true; ctx.mode = SM4.SM4_DECRYPT; byte[] keyBytes; keyBytes = secretKey.getBytes(); SM4 sm4 = new SM4(); sm4.sm4_setkey_dec(ctx, keyBytes); byte[] decrypted = sm4.sm4_crypt_ecb(ctx, Base64.decodeBase64(cipherText.getBytes(CHARSET))); return new String(decrypted, CHARSET); } catch (Exception e) { e.printStackTrace(); return null; } }
版权声明:本文标题:国产加密算法SM4实现(Java) 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1686917125a118028.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论