精华内容
下载资源
问答
  • 2021-11-16 14:23:38

    关于安全算法分为对称和非对称,涉及加密、解密、认证、访问控制等。

    比如最近比较热的汽车电子的OTA功能,就需要通过加密的方式实现,保证云端和MCU才能解密。

    对称算法包括:DES、AES等,如AES-128/192/256(ECB、CBC)、DES-32、DES-128、3DES

    非对称算法包括:RSA、ECC等,如RSA-1024、RSA2048、RSA3072、RSA4096、ECC-133、ECC-256、ECIES、RSA OAEP、

    校验算法包括:CRC、Hash(SHA1-3、256)、RSA sig.或ECC sig,非对称验签、CMAC/HMAC、ECDH、ECDSA(P256)

    随机数支撑:TRNG、PRNG

    在汽车OTA方案中,有标准如SHE、HSM、EVITA等安全实现机制,如HSE(hardware security engine)。

    密钥管理涉及:key management、key import、key export、key generation、key derivation、key exchange

    更多相关内容
  • CANoe诊断用安全算法DLL VS工程,用于CANoe诊断27服务安全访问,自动生成key,需要根据各自需求更改内部安全算法
  • 安全算法】一文带你简要了解常见常用的安全算法**0 前言****1 算法的大致分类****2 对称加解密算法****2.1 DES/TDES算法****2.2 AES算法****2.3 SM4算法****2.4 RC2、RC4算法****2.5 对称加密算法对比总结****3 非...


    0 前言

    笔者有多年从事金融POS机系统开发的经验,对数据的安全理解较深,期间对各式各样的安全算法也是经常打交道,现整理一些基本概念,仅供大家学习和参考。

    1 算法的大致分类

    这里所说的算法指的是常见的数据处理算法(国际/国标通用的那种),大致可分为:对称加解密算法非对称加解密算法信息摘要算法。下文将对这几类算法做一个对比和总结。

    2 对称加解密算法

    对称加密算法,顾名思义,就是算法的执行过程是对称的;用最简单的话说,就是加密方和解密方使用的密钥是一致的,只不过执行的过程是相反的,一方(A)对明文(P)使用密钥K1进行加密得到密文(C),另一方(B)对密文(C)使用密钥K2进行解密拿到明文(P’); 要想两者的明文P和P’相等,必须保证密钥K1等于K2,这就是对称加密算法的基本要求。

    常见的对称算法有DES、TDES、AES、SM4、RC2/4等。

    2.1 DES/TDES算法

    DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。【摘自:百度百科 https://baike.baidu.com/item/DES/210508】

    DES算法,有以下特点:密钥长度适中、实现原理较为简单、加解密过程较为高效。通常我们见到的DES密钥长度为8字节,即64比特位,但是实际使用的密钥的有效位是56比特位,即每个字节的最高位(第8、16、24、32、40、48、56、64比特位)实际都是不参与算法加解密运算的,我们称之为校验位,它们存在的目的是使得每个密钥都有奇数个1。由此可知,有2组8字节不完全相同的密钥,加解密结果是一致的这种情况是可能存在的。

    算法对数据做加解密,都是以一定长度的数据块作为输入的;并且,对称算法有个特点,输入数据块的长度一般等于密钥的长度;也就是说,在进行DES运算(加密或解密)时,输入的数据长度都必须是8字节。同时,在DES对称算法中,输出的数据长度等于输入的数据长度,即8字节输入8字节输出。至此,有的童鞋会问,如果我们要执行加密的数据远远不止8字节呢,应该怎么办?这个问题就已经涉及到加解密过程的数据分组问题了,常见的分组方式有ECB方式和CBC方式,后续会对这2种方式做更为详细的介绍。

    TDES全称是Triple Data Encryption Standard,即我们常说的3DES;三重数据加密算法(TDEA,Triple Data Encryption Algorithm)。它是DES算法的加强版本。TDES的执行过程如下:其中C表示密文、P表示明文、E表示加密运算、D表示解密运算、Kx表示不同组别的密钥。

    TDES加密过程为:C=Ek3(Dk2(Ek1§))
    TDES解密过程为:P=Dk1(EK2(Dk3©))

    由上可知,标准的TDES的密钥长度是24字节的,即K1-K2-K3;但在实际生产使用过程中,也常使用16字节长度的密钥,此时密钥的K3部分将由K1来充当,即K1-K2-K1,强制把16字节的密钥转换为24字节的密钥。另一方面,从TDES加解密的过程,我们也可以发现当K1=K2,使用TDES的效果与单DES的效果是一致的。

    注意的是,前面说到对称算法加解密运算,输入数据长度一般等于密钥的长度,而TDES的密钥长度是24字节,但这并不意味着执行TDES加解密时,输入数据长度必须是24字节;相反,它的输入数据长度还是8字节,与DES运算的输入完全一样。这也就是为什么说TDES是DES的加强版。同样的8字节输入数据经DES运算和TDES运算,通常是不一样的,除非TDES的密钥满足K1=K2的关系。

    2.2 AES算法

    高级加密标准,全称是Advanced Encryption Standard,缩写:AES。在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。【摘自 百度百科 https://baike.baidu.com/item/aes/5903?fr=aladdin】它是一种不同于DES的另一类对称算法,加密的强度比DES高,破解的难度也较大,同时实现它的加解密运算难度也高一些。

    由于它也是对称加密加密算法,所以前面对加密算法描述的特点它都有,不同的是,它的是密钥长度有3种可能值,16字节、24字节、32字节,分别对应的密钥强度为128比特位、192比特位和256比特位。执行加解密运算时,输入数据的长度为16字节(128比特位),且输出数据长度等于输入数据长度。

    2.3 SM4算法

    SM算法是国密算法,国密即国家密码局认定的国产密码算法。主要有SM1、SM2、SM3、SM4,其中SM1 为对称加密,其加密强度与AES相当,但该算法不公开,调用该算法时,需要通过特定的加密芯片的接口进行调用;SM4为对称加密算法;SM3为信息摘要算法;SM2为非对称加密算法。后续的文章会对SM算法做更为详细的介绍。

    SM4算法的特点是密钥长度和分组长度均为128位;虽然密钥长度跟DES类似,但加密强度却能与AES媲美;并且在国家信息安全战略的大背景下,国密算法的大力推广得到了越来越多的支持。像目前国内出厂很多涉及金融安全的终端产品,如POS机、ATM机、密钥键盘、金融交易后台、商业银行系统等等,都是强制要求必须支持国密相关算法,并且发售的机器或上线的系统都必须通过国家密码局授权的国密认证,拿到对应的国密认证证书,才能最终商用,这或许能成为SM算法大放异彩的一个契机,若干年后指不定街边的小小机器都在跑国密算法呢。

    2.4 RC2、RC4算法

    RC2是由著名密码学家Ron Rivest设计的一种传统对称分组加密算法,它可作为DES算法的建议替代算法。它的输入和输出都是64比特。密钥的长度是从1字节到128字节可变,但目前的实现是8字节(1998年)

    RC4加密算法是大名鼎鼎的RSA三人组中的头号人物Ronald Rivest在1987年设计的密钥长度可变的流加密算法簇。之所以称其为簇,是由于其核心部分的S-box长度可为任意,但一般为256字节。该算法的速度可以达到DES加密的10倍左右,且具有很高级别的非线性。

    尤其RC算法的安全性比较低,在常见的安全场景下,一般都不会使用RC算法。

    2.5 对称加密算法对比总结

    中文名称密钥长度可能值加解密数据块长度资源消耗运算速度安全性
    简称数据加密标准/DES8字节8字节较快
    3重数据加密标准/TDES16字节、24字节 8字节8字节
    高级加密标准/AES16字节、24字节、32字节16字节
    国密对称算法/SM416字节16字节
    RC算法(RC2)目前使用是8字节8字节
    RC算法(RC4)密钥长度可变长度可变快(快DES10倍)

    3 非对称加解密算法

    世界万物都是平衡的,正如计算机的世界一样,有0的地方就一定有1;同样的,在算法理论上,既然有【对称加密算法】,那肯定就会有【非对称加密算法】。

    非对称算法,顾名思义:算法的执行过程是不对称的,也就是说加解密双方的密钥是不对称的。在非对称算法的理论上,密钥有公钥和私钥之分:其中私钥是代表自己唯一身份的一组密钥标识,不同的非对称加密算法,采用不同的数学理论来标识这个“唯一性”,比如RSA算法,使用的是“很大的素数”这种方法来标识;通常来说,私钥是不对外公开的,就好比藏在自己心里的秘密一样,不能被外人知晓,否则,数据的加密就变得不可靠,存在密钥泄露的风险。与私钥对应的密钥叫公钥,公钥与私钥正好相反,它是允许对外公开的,也就是任何人都可以持有加密方的公钥信息。看到这里,很多童鞋开始疑问:既然密钥(公钥)都公开了,那加密还有什么用,谈何安全性可言?有这样疑问的童鞋,大概思路还停留在【对称加密算法】的基础上,等我详细讲解完【非对称加密算法】的加密和解密,你就一定明白到底是怎么一回事了。

    非对称算法的加密和解密的特点是:一段数据明文经私钥加密后,则需要使用该私钥对应的公钥做解密;反之,一段数据明文经公钥加密后,则需要使用该公钥对应的私钥做解密;即【公钥加密对应私钥解密,私钥加密对应公钥解密】。使用公式表达如下:其他E表示加密,D表示解密,PriKey表示私钥,PubKey表示公钥,A、B分别表示通讯双方,P表示数据明文,C表示数据密文。

    ​ 通讯方A 通讯方B

    E(P) by PriKey[A] = C 对应 D(C) by PubKey[A] = P
    E(P) by PubKey[B] = C 对应 D(C) by PriKey[B] = P

    通过如上公式,我们可以很清晰的看到,通讯AB双方需要使用非对称算法加密通讯报文,必须想方设法获取到对方的公钥,这样整个加密的通道才能完全打通。而前面我们也说到了,自己的公钥一般都是公开的,允许任何人持有,只要保证自己的私钥是保密的即可,这就是SSL通讯的理论基础。在SSL通讯之前,通常会有通讯握手动作,这个握手动作就是为了取得对方可信任的公钥,至于如何保证自己取得的公钥就是对方的真实公钥,而不是非法监听报文的“中间人”的假公钥,这就是SSL双向认证要解决的核心问题。该部分的内容,后续会有更为详细的文章做更近一步的介绍。

    3.1 对称加密算法与非对称加密算法的本质区别

    通过上面对非对称算法的介绍,大家可以了解到非对称算法核心的部分就是:密钥分为公钥和私钥,私钥保密公钥公开,私钥加密的密文需要使用公钥解密,公钥加密的密文需要私钥解密。具体的非对称算法和对称算法的区别如下表所列:

    算法密钥类似加解密的特点
    对称加密算法通讯双方有且只有一个共同的密钥K加密方使用密钥K加密,解密方使用密钥K解密
    非对称加密算法密钥有分私钥和公钥;通讯双方分别持有自己的私钥和对方的公钥;加密方使用自己的私钥加密数据,解密方使用对方的公钥解密数据;加密方使用对方的公钥加密数据,解密方使用自己的私钥解密数据;

    3.2 非对称加密算法的分类和对比

    常见的非对称加密算法有RSA算法、SM2算法;前者是国际通用的算法,后者是国密算法的一种。

    3.2.1 RSA算法

    RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。【摘自: 百度百科 RSA算法 】

    RSA加密算法的密钥长度不像我们所认知的对称加密算法 ,它的密钥长度是可变的,一般用位来表示,常见的有1024位和2048位,甚至4096位。密钥的位数越长,理论上来说,解密的难度越大,加密的强度就越大。综合加密级别和使用的便利性,【RSA2048】是我们最常见的。当RSA的密钥位数确定了,那它的【模长】也就确定了,模长的值为密钥位数对应的字节数;计算公式如下,其实M为模长,B为密钥的长度:
    M = (B + 7) / 8 当M等于1024位时,对应的模长为128字节;当M等于2048位时,对应的模长为256字节。
    了解【模长】的概念之后,我们需要知道RSA算法执行加密解密操作时,基本的数据块长度。在RSA算法中,执行加密和解密操作,输入的数据块长度都必须等于模长,否则算法内部无法处理;即RSA密钥的长度不同,对应输入数据块的长度也是不同的,这一点与DES、AES等对称加密算法是完全不一样的。
    假设我们有4个RSA接口:
    RSA_prikey_encrypt(uint8_t *out, int *out_len, const uint8_t *in, int in_len, const RSA_KEY *pri_key);
    RSA_prikey_decrypt(uint8_t *out, int *out_len, const uint8_t *in, int in_len, const RSA_KEY *pri_key);
    RSA_pubkey_encrypt(uint8_t *out, int *out_len, const uint8_t *in, int in_len, const RSA_KEY *pub_key);
    RSA_pubkey_decrypt(uint8_t *out, int *out_len, const uint8_t *in, int in_len, const RSA_KEY *pub_key);
    有趣的是,当我们有一段固定的数据in,分别输入RSA_pubkey_encrypt和RSA_pubkey_decrypt接口,得出的out居然是一样的!同样的在类似的私钥接口,也有类似的现象。经过这个实验,我么可以得出结论:根本没有所谓的公钥加密和公钥解密之分,公钥加密就是公钥解密,私钥加密也就是私钥解密;所以我们应该对公钥私钥、加密解密做个统一叫法,应该就是私钥运算和公钥运算。所以以上的接口应改为:

    RSA_prikey_operation(uint8_t *out, int *out_len, const uint8_t *in, int in_len, const RSA_KEY *pri_key);
    RSA_pubkey_operation(uint8_t *out, int *out_len, const uint8_t *in, int in_len, const RSA_KEY *pub_key);

    3.2.2 SM2算法

    SM2算法是国产的非对称算法,它的诞生就是为了取代RSA算法。SM2性能更优更安全:密码复杂度高、处理速度快、机器性能消耗更小。SM2算法和RSA算法比较如下:

    SM2RSA
    算法结构基于椭圆曲线(ECC)基于特殊的可逆模幂运算
    计算复杂度完全指数级亚指数级
    存储空间192-256bits2048-4096bits
    私钥生成速度较RSA算法快100百以上
    加解密速度较快一般

    SM2算法与RSA算法类型,它也有公钥和私钥之分,它的密钥特点是私钥固定长度32字节,而公钥有x和y两个分量,每个分量都是32字节,总共是64字节。

    在执行加密运算时,输入数据块的长度是变长的,而加密后的密文长度等于输入长度+96字节。

    在执行签名运算时,输入数据块的长度也是变长的,但签名后的数据长度则固定为64字节。

    限于篇幅原因,后续再写专门的文章来介绍SM2算法。

    3.2.3 ECC算法

    椭圆曲线密码学(英语:Elliptic curve cryptography,缩写为ECC),一种建立公开密钥加密的演算法,基于椭圆曲线数学。椭圆曲线在密码学中的使用是在1985年由Neal Koblitz和[Victor Miller](https://baike.baidu.com/item/Victor Miller)分别独立提出的。

    ECC的主要优势是在某些情况下它比其他的方法使用更小的密钥——比如RSA加密算法——提供相当的或更高等级的安全。ECC的另一个优势是可以定义群之间的双线性映射,基于Weil对或是Tate对;双线性映射已经在密码学中发现了大量的应用,例如基于身份的加密。不过一个缺点是加密和解密操作的实现比其他机制花费的时间长。

    3.2.3.1 优点

    安全性高:
    有研究表示160位的椭圆密钥与1024位的RSA密钥安全性相同。
    处理速度快:
    在私钥的加密解密速度上,ecc算法比RSA、DSA速度更快。
    存储空间占用小:
    带宽要求低。

    3.2.3.2 公钥密码系统的加密算法ECC与RSA的对比

    第六届国际密码学会议对应用于公钥密码系统的加密算法推荐了两种:基于大整数因子分解问题(IFP)的RSA算法和基于椭圆曲线上离散对数计算问题(ECDLP)的ECC算法。RSA算法的特点之一是数学原理简单、在工程应用中比较易于实现,但它的单位安全强度相对较低。用国际上公认的对于RSA算法最有效的攻击方法–一般数域筛(NFS)方法去破译和攻击RSA算法,它的破译或求解难度是亚指数级的。ECC算法的数学理论非常深奥和复杂,在工程应用中比较难于实现,但它的单位安全强度相对较高。用国际上公认的对于ECC算法最有效的攻击方法–Pollard rho方法去破译和攻击ECC算法,它的破译或求解难度基本上是指数级的。正是由于RSA算法和ECC算法这一明显不同,使得ECC算法的单位安全强度高于RSA算法,也就是说,要达到同样的安全强度,ECC算法所需的密钥长度远比RSA算法低。这就有效地解决了为了提高安全强度必须增加密钥长度所带来的工程实现难度的问题。

    3.2.3.3 常见的几种ECC椭圆参数曲线

    根据ECC算法的数学原理,不同的椭圆参数曲线,就可以认为对应着不同的加解密方式,加解密双方需要使用相同的椭圆参数曲线。

    常见的椭圆参数曲线有:SECP256(NIST P-256)、BrainpoolP256、FRP256。

    3.2.3.4 ECC算法的常用接口

    生成公私要对(ecc_generate_key_pair)

    这个应用场景主要用于设备初始化,生成私钥和公钥。

    私钥运算(ecc_signature)

    这个应用场景主要是用于数据签名。

    公钥运算(ecc_verify)

    这个应用场景主要是用于签名验证,即验签。

    密钥交互(ecc_ecdh)

    这个应用场景主要是用于密钥交换。

    3.2.3.5 ECC算法运算长度

    ECC算法的密钥越长,安全度越高,破解的难度越大,当然运算的复杂度也较高。

    一般来说,常用的ECC密钥强度是64字节的私钥,即所谓的256bits密钥;

    这个时候一般签名出来的数据长度就是64字节。

    3.3 非对称加密算法的应用场景

    值得注意的是,数据加解密的过程中,虽然公钥和私钥都可以用于加密,也都可以用于解密,并没有严格的限制;但是,在实际的应用中,通常有:

    私钥加密,公钥解密:通常应用有签名、验签,即产生签名的一方使用自己的私钥对数据进行签名操作,而验签签名数据是否合法的一方使用签名方的公钥对签名数据进行验签;所以这里可以简单地认为,签名就是私钥加密,验签就是公钥解密。
    公钥解密,私钥解密:通常应用在对数据的加密传输,即加密方使用解密方的公钥做加密动作,这样就意味着这段加密数据只有解密方一人能解开,因为解密方的私钥是不公开的,只有它自己知道,这样就可以很好地保证的加密数据的安全性。

    4 信息摘要算法

    4.1 什么是信息摘要算法?

    信息摘要算法是一种对“信息”进行【摘要化】处理的算法。通俗地来说,就好比本文,假设它很长,那么读者在第一时间看到它的时候并不会完全阅读全文,而是往往会先去读一下文章的【摘要】,通过文章的摘要部分,简要了解下文章的主要内容。类似地,在信息密码学领域,同样有这种的操作,这就是信息摘要算法的产生背景。

    假设有一段数据(专业术语叫“消息”),经过【信息摘要算法】处理后,它将变成一段固定长度的【信息摘要】,用公式表示如下,其中M表示消息原文,D表示输出的消息摘要,P表示信息摘要算法。

    P(M with any length) = D(with fixed length)

    通过公式,我们可以很直观地看出,信息摘要算法的输入数据长度是可以为任意长度,但是在实际使用的过程中,倘若输入数据的长度过于长,我们会采用将输入数据块采用数据分组的方式一步步输入,最后得到信息摘要结果的输出。而输出的信息摘要,通常都是固定长度的,至于信息摘要结果的固定长度是多少,是与具体的摘要算法相关的,下文会详细介绍各种信息摘要算法的摘要输出情况。

    还有一点,公式中并没有体现“加密和解密的相互过程”,也就是说【信息摘要算法是单向的,不可逆的】。严格来说,它并不是一种【加密】算法,仅仅是【摘要】算法。由于它计算的不可逆性,所以经信息摘要算法计算出来的信息摘要D,一定程度上就代表了信息原文M。倘若有原文M1和原文M2,经过相同的信息摘要算法P,得到相同的信息摘要D,这种情况在密码学上,我们称之为【碰撞】。一般而言, 好的摘要算法,没有人能从中找到【碰撞】或者说极度难找到。虽然【碰撞】是肯定存在的(碰撞即不同的内容产生相同的摘要),但因目前信息科学发达程度非常高,计算机的运算能力得到了前所未有的提升,仅通过计算机运算的暴力破解,某些较弱的信息摘要算法就能被【碰撞】成功。

    4.2 常见的信息摘要算法

    常见的信息摘要算法有:MD2/4/5、SHA1/SHA224/SHA256/SHA384、SM3算法、MAC算法等。

    4.2.1 MD(Message Digest):消息摘要

    MD算法,是诞生于比较早的消息摘要算法,在网络应用上也比较常见,比如在某个网站上下载一个文件,通常它会标识该文件的MD5值,当下载者完成下载文件到本地之后,使用工具对下载的文件执行MD5计算,求出一个MD5摘要值,与网站上给出的参考MD5值进行对比;如果两者相等,则表示下载的文件是可靠的,没有被篡改过的;反之,如果MD5值对不上,则表明下载的文件是被篡改过的,可能是网络攻击者投放的病毒携带文件或者是在下载的过程中文件出现了损坏等情况,此时应该对文件进行删除操作。

    4.2.2 SHA(Secure Hash Algorithm):安全散列

    SHA系列的算法从版本上划分有SHA-1和SHA-2;SHA-1和SHA-2是该算法的两个不同版本。它们两者之间在构造上(散列结果是怎样被原始数据创建出来的)和签名的位数上都有不同和签名的位长。你应该把SHA-2看作是SHA-1的继承者,因为这是一个整体上的改进。

    SHA-1就是我们常见到的SHA1;SHA-2主要有SHA224、SHA256、SHA384、SHA512等等,不同的数字代表信息摘要输出的位数。与MD系列算法类似,数字值越高表示摘要算法的安全性越高,计算的复杂性也越大;但不同于MD算法的是,SHA算法每个算法输出的信息摘要长度是不一样的。

    SHA1,产生的信息摘要为160bits,即20字节
    SHA224,产生的信息摘要为224bits,即28字节
    SHA256,产生的信息摘要为256bits,即32字节
    SHA384,产生的信息摘要为384bits,即48字节
    SHA512,产生的信息摘要为512bits,即64字节
    更为详细的SHA算法介绍,可以参考: https://www.cnblogs.com/block2016/p/5632234.html

    4.2.3 SM(Shangyong Mima):国密算法,即商用密码

    经查证,国密算法的英文字母缩写SM,其实是【商用密码】的中文拼音首字母简写。国密即国家密码局认定的国产密码算法,即商用密码。

    在国密算法的列表中,SM3算法就是实现了类似MD算法和SHA算法的信息摘要算法。它和其他2种摘要算法一样,都是不同长度的信息输入,产生固定长度的摘要输出。不同的是,它输出的信息摘要长度固定为256bits,即32字节。在实际使用过程中,SM3算法比较少会单独使用,而是配合SM2【非对称加密算法】配合使用,实现数字验签和消息验签的应用。

    4.3.4 MAC(Message Authentication Code):消息认证码

    MAC算法不同于以上3种信息摘要算法;MAC算法是带密钥的Hash函数:消息的散列值由只有通信双方才知道的秘密密钥K来控制。此时Hash值称作MAC。表达公式如下所示,其中M表示信息原文,P表示MAC算法,MAC表示输出的MAC值,K表示MAC密钥:

    P(M with any length) by K = MAC(with fixed length)
    通过公式我们可以发现,计算MAC通常会有KEY的参与,那么在信息安全通讯领域,接收方要想验证收到的数据是否正确,就需要利用以上公式,输入MAC密钥重新计算一遍MAC值,然后对比计算值和收到的MAC值;若相等才认为数据是合法。这里涉及到一个MAC KEY,发送方和接收方对相同的数据进行MAC运算,能得到相同MAC值的前提,除了两者需使用相同的MAC算法外,还需要保证两者的MAC KEY是一致的(通常计算MAC采用的是对称加密算法)。至于,在实际生产应用过程中,如何保证两者的MAC KEY是一致的,或者说MAC KEY是如果从一方传递到另一方的,这又是另一个话题,这种应用场景,在POS机与银行后台信息交互的安全性,就是利用MAC KEY的。

    MAC算法是一个统称,它很多种实现,在POS行业,常用的MAC算法有CUP模式、EMV2000模式、或者自定义形式的MAC算法。MAC算法的核心是如何将输入数据分组,利用MAC KEY做一些XOR、移位、加密等操作,使得输入数据散列化,最后再利用MAC KEY执行加密操作(通常为对称加密)得到MAC值。

    值得注意的是,虽然MAC算法有MAC KEY的参与,但是它计算过程依然是单向的,不可逆的,这也是为什么会把它归为【信息摘要算法】的主要原因。

    4.3.4 常见信息摘要算法的对比

    信息摘要算法信息输入长度摘要输出长度密钥安全性
    MD5*128bits(16字节低,有被碰撞的可能性
    SHA1*160bits(20字节)低,有被碰撞的可能性
    SHA224*224bits(28字节)较高
    SHA256*256bits(32字节)高,推荐使用,最常使用
    SHA384*384bits(48字节)高,推荐使用,推荐使用
    SHA512*512bits(64字节)高,高安全性场景下推荐使用
    SM3*256bits(32字节)高,推荐使用
    MAC算法*视不同的MAC算法而不同;有的是8字节,有的是16字节高,除非密钥破解

    注:表中*表示输入长度为“任意值”;此处的任意值,通常也是有限制的,比如SHA256,*应小于2的64次方,而SHA512,*应小于2的128次方。

    4.3 信息摘要算法的应用场景

    常见的信息摘要算法的应用场景有以下几种:

    4.3.1 网络文件下载

    前面也简单提到了,在网络文件下载的时候,通常会有附上对应下载文件的摘要值,常用的是MD5或SHA1值;这个主要目的是给下载者在下载完网络文件后,做最后的文件正确性和完整性的确认。如果计算出来的摘要值,与网站上的摘要不相等,我们应认为下载的文件是不可信任的,应当做删除处理。

    4.3.2 数字签名和信息验签

    在产生数学签名的过程中,通常会有一步是对输入数据原文做摘要运算,这样做的主要目的是将输入数据原文迷你化。由于经摘要算法处理后,信息摘要的长度都是一定的,所以在做签名运算的时候,只需要对信息摘要做签名运算,在一定程度上就是输入信息的原文做签名运算。输入数据签名后,发送方会将签名数据附在输入信息的尾部,一同发送给接收方。而在验签流程中,接收方收到发送方的信息原文和签名值,首先需要做的是根据双方协商的信息摘要算法,做同样的摘要运算,得到摘要值M’,然后使用密钥对签名数据进行解密运算,得到发送方的摘要M;如果M’ = M,则表示验签通过,接收的数据是可任性的。

    关于数字签名的具体细节,后续会有更为详细的文章做更进一步的介绍,比如常见的签名算法是怎么工作的,等等。

    4.3.3 安全报文传输

    这种应用场景,主要是MAC算法的应用,最常见的就是POS与银行后台的报文传输。由于涉及到金融风险,所以在POS机与银联后台通讯的过程中,除了对个人账户的敏感信息(如卡号、卡密码)等做加密处理外,还需要对整一个通讯报文做MAC计算,在发送报文的时候,MAC值附在原始的密文后面以供接收方对接收的密文做MAC校验。至于为何要这样做,就是为了保证通讯报文的其他信息要素不能被篡改,比如消费的金额。试想下,如果你在超市消费了1.00元,但是由于报文被截取了,攻击者将报文中的消费金额篡改为100.00元;这种情况下,除非报文攻击者拿到了POS与银行后台通讯的MAC KEY,否则它计算出来的MAC值必定与银行后台计算的MAC值对不上,进而被银行后台当做非法报文,做丢弃处理。但如果银行后台没有MAC值校验这一步操作,那么对于消费者而言,就是明明消费了1.00元却被扣款100.00元;这个后果将变得不堪设想。

    5 非对称算法和信息摘要算法的核心应用:数字签名和消息验签

    5.1 数字签名是什么?

    签名,一个在日常生活中,很经常听到并使用的名字。在平时,我们经常会签署各式各样的文件,在我国的法律中,亲笔签名在一定程度上是具有法律效力的,表示当事人对签署的文件知悉并且认可,一旦“签名”生成后,它具备了法律意义。又比如,我们在POS机消费后打印的消费单据上签署自己的姓名,则表示持卡人认同这笔消费交易,银行或收单机构拿到这张经消费者签名的单据,就可以完全最终消费款项的清算。在我国,POS机消费时,大部分时候,我们都要输入银行卡密码,打印消费单据后还需要签署自己的姓名;而在国外,由于他们的征信系统较为发达,往往在POS机消费时,是不需要输入银行卡密码的,而消费的唯一凭证确认,就是消费单据上签署的签名。在此种情况下POS机的操作员,有义务确认消费者签署的姓名与卡片背部的参照签名笔迹是否一致;同时,操作员也有权利,当发现消费者签署的姓名笔迹与卡片后背签名笔迹差异较大时,拒绝此卡片消费。通过以上的一些生活例子,我们可以了解到【签名】是一个很重要的玩意,一定程度就代表了本人的认可和无异议。
    那么,在数字信息领域,究竟什么是【数字签名】呢?数字签名(又称公钥数字签名、电子签章)是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。数字签名,就是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。(摘自: 百度百科 数字签名)。
    从密码学的角度来说,【数字签名】主要解决了两个核心问题:发送的消息是完整的,未被篡改的;接收的消息一定就是对应发送者发送的,别人无法仿制。前者体现的是数据的完整性,后者体现的是数据的不可抵赖性。

    5.2 为什么数字签名采用非对称算法和信息摘要算法?

    从上一小结,我们可以知道【数字签名】的两个核心特点:不可抵赖性和完整性。通过对之前学习的非对称加密算法和信息摘要算法的基础知识一对比,我们可以发现:

    非对称加密算法正好解决了不可抵赖性的问题,因为在非对称算法体系中,经私钥加密的数据只有私钥对应的公钥才能解开,别人的公钥是无法解密出原文的,这就是不可抵赖的体现,即任何人都无法冒充发送者。

    信息摘要算法恰好解决了数据完整性的问题,因为在信息摘要算法中,不同的数据输入,产生的摘要是不一样的;当摘要数据一样时,我们就可以认为数据原文是一致的,也就认可了数据是完整的,没有被篡改的。

    两者一结合,恰好就诞生了【数字签名】这个最佳实践,达到了数据传输中不可修改性的安全要求。

    5.3 数字签名的操作过程

    前面的讲解,我们知道了【数字签名】的特性。在实际的应用过程中,数字签名的应用公式如下所示,其中M表示消息原文,S表示数字签名,P表示非对称算法的私钥运算,D表示信息摘要算法的运算。

    P(D(M [with any length])) = S [with fixed length]
    具体来说,发送方产生一个数据签名,需要经过以下几个步骤:

    使用【信息摘要算法】,对任意长度的信息原文做摘要运算,得到一段固定长度的摘要数据;
    如果该摘要数据的长度,没有达到非对称加密算法做加解密运算的输入长度,通常还需要使用填充标准对摘要数据进行必要的填充,以达到非对称算法的运算条件;常用的填充标准有PKCS1-padding;
    使用【非对称加密算法】的私钥对填充后的摘要数据做加密运算,得到一段固定长度的数字签名;
    发送方将数字签名拼接在信息原文的尾部,一同发送给接收方,完成数据的单方向传输。
    经过以上的步骤后,发送方就成功将信息原文和对应的数字签名,传递给了接收方;剩余的事,就是接收方对数据的验签操作。

    5.4 消息验签的操作过程

    接收方收到发送方发送的数据报文(信息原文+数字签名)后,需要经历以下步骤来完成对报文消息的验签操作:

    首先,对数据报文进行分解,提取出信息原文部分和数字签名部分;
    与产生数字签名流程一样,使用相同的信息摘要算法对信息原文做摘要运算,得出消息原文的摘要D1;
    与产生数字签名流程相反,使用【非对称加密算法】中签名私钥对应的公钥对数字签名部分做解密运算,解密后得到原始发送方发送的经填充后的摘要D2;
    与产生数字签名流程相反,使用相同的数据填充标准对摘要D2做去填充操作,得到原始消息的附带的摘要D3;
    比较D3和D1;如果两者相等,则表示对数字签名的验签是OK的,消息原文的数据是可信任的;反之,若D3不等于D1,则可以认为消息原文是不可信任的,数字签名中的【完整性】和【不可抵赖性】可能遭到了破坏;我们应该摒弃信息原文。

    5.5 数字签名算法的分类

    数字签名算法,就是使用RSA、MD5、SM2、SHA、SM3等非对称算法和信息摘要算法进行混搭组合。数字签名算法的基本表示格式为:xxxWithYYYEncryption,其中xxx表示信息摘要算法,yyy表示非对称加密算法。常见有的以下几种:

    md5WithRSAEncryption:摘要运算采用MD5,非对称算法使用RSA;
    sha1WithRSAEncryption:摘要运算采用SHA1,非对称算法使用RSA;
    sha256WithRSAEncryption:摘要运算采用SHA256,非对称算法使用RSA;【常用】
    sm3WithSM2Encryption:摘要运算采用SM3,非对称算法使用SM2。

    5.6 数字签名的核心应用场景:https网络通讯

    经以上的各小结,我们基本掌握了数字签名的主要内容,这一小节,我们介绍下数字签名的核心应用:https网络通讯。

    HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer 或 Hypertext Transfer Protocol Secure,超文本传输安全协议),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。

    由它的定义可知,要想实现https,除了应用层需要有http的支持,还需要在传输层支持SSL。SSL正是为了解决网络通讯的安全性问题而诞生的,简单的说,通过SSL的加入,在浏览器和网页服务器之间的数据都是加密的,而不像之前http那样,数据完全在网络上裸奔。目前网络安全问题越来越突出,越来越多的网络信息泄露的案例爆发出来,正是由于这些安全性问题的暴露,SSL的应用得到了越来越多的支持。

    限于篇幅原因,本小结不对SSL的具体细节做阐述,仅仅是简要描述数字签名在SSL中的应用方法;后续笔者会写一篇专门的文章来进一步解释SSL通讯的前前后后,敬请关注。

    说到数字签名在SSL的应用,它主要是帮助发送方和接收方协商必要的数据,比如网络通讯的加密密钥。我们知道,网络数据是庞大的,而非对称算法的加密速度是远远比对称加密算法慢的,所以在网络通讯的报文不太适合直接使用非对称算法做加密,比较合适的做法的通讯报文还是采用对称加密算法加密,但是对称加密算法使用的对称密钥是发送方和接收方在正式通讯前进行在线协商的;密钥协商的过程使用数字签名的技术,保证协商的密钥是完整的(保证是没被篡改的),并且是不可抵赖的(保证是发送方的)。在密钥协商时,通讯双方分别利用自己的私钥和公钥,结合数字签名技术,完成协商动作。

    上面讲消息验签的时候,我们提到消息验签必须要使用签名方的公钥做解密运算,这个公钥一定程度上代表了签名方的身份;但是,我们如何知道我们拿到的公钥,就是我们认为的那个签名方的公钥,而不是网络攻击“中间人”的公钥呢?这就需要CA (Certificate Authority)帮助我们确认这个公钥的合法性。具体的做法是,我们拿到签名方的公钥时,它并不仅仅是一个公钥,而公钥+经CA签名的数字签名,这叫做公钥证书。我们对公钥证书,先用CA的公钥对公钥证书的数字签名进行验签,如果验签成功,则表示我们拿到的公钥是可信任的。那么,CA的公钥,我们又通过谁来保证它是可信任的呢?

    这似乎是一个无穷无尽的问题?究竟是怎么回事呢?笔者在这里先卖个关子,有兴趣的读者,可以关注笔者后续有关SSL通讯的详细介绍。

    6 更多参考链接

    [1] 【安全算法的github仓库】
    [2] 【安全算法之概述】一文带你简要了解常见常用的安全算法
    [3] 【安全算法之base64】base64加解密的C语言源码实现
    [4] 【安全算法之MD5】MD5摘要运算的C语言源码实现
    [5] 【安全算法之SHA1】SHA1摘要运算的C语言源码实现
    [6] 【安全算法之SHA224】SHA224摘要运算的C语言源码实现
    [7] 【安全算法之SHA256】SHA256摘要运算的C语言源码实现
    [8] 【安全算法之SHA384】SHA384摘要运算的C语言源码实现
    [9] 【安全算法之SHA512】SHA512摘要运算的C语言源码实现

    展开全文
  • 网络安全:常见安全算法

    千次阅读 2019-07-22 11:10:50
    废话不多说,本文将介绍常见的几种安全算法:数字摘要,对称加密,非对称加密,数字签名,数字证书。 1.数字摘要 数字摘要(消息摘要)是将一个消息或者文本内容使用函数或算法转换成固定长度的值。 如 函数y= f...

    废话不多说,本文将介绍常见的几种安全算法:数字摘要,对称加密,非对称加密,数字签名,数字证书。

    1.数字摘要

    数字摘要(消息摘要)是将一个消息或者文本内容使用函数或算法转换成固定长度的值。

    如  函数y= f(x)   x即为消息或文本, y为数字摘要。当消息和摘要(y1)在网络传递时,如果消息在网络传递过程中被恶意的篡改了,接收者通过对消息使用相同的算法或函数重新计算得到新数字摘要(y2),新数字摘要(y2)与原数字摘要(y1)进行比较,就可以判断消息是否被篡改。因此数字摘要可以验证消息的完整性。

    hash碰撞:如果两个消息时相同的,计算出的值(数字摘要)一定时相同的,如果两个不同的消息,计算出的值不一定相同,这种情况称之为hash碰撞。因此一个hash函数的好坏取决于碰撞的概率,如果说攻击者能够利用hash碰撞轻易的伪造出不同的消息hash值(数字摘要)时相同的。那么这样的hash函数时危险的。可以认为,摘要的长度越长算法越安全。由于数字摘要并不包含原文的完整信息,因此,要从摘要信息逆向得出摘要的明文,原则上是不肯能完成的。

                                                    

    数字摘要的特点:

          (1)无论输入的消息有多长,计算出的摘要长度是固定的。MD5算法计算出的摘要长度是128位,SHA-1算法计算出的摘要160位。

          (2)一般输入的消息不同,则对应摘要不同,这种情况是hash碰撞。但消息相同,对应摘要必然相同。

          (3)摘要并不包含原文的完整信息,因此逆向得不到原文信息。如果你想通过穷举的方式,采用暴力手段,尝试每一个信息计算出摘要,然后于原摘要进行对比,是可以回复原文的,但以目前的计算水平来看,需要消耗很长时间,因此被认为是不可能实现的。

    接下来一起看一下获取数字摘要相关的算法。

    MD5 算法:     

     MD5(Message Digest  Algorithm 5) 信息摘要算法5,是数字摘要算法的一种实现摘要长度为128位。MD5由MD2,MD3,MD4改进而来,主要增强了算法复杂度和不可逆性。该算法具有普遍,稳定,快速的特点,因此业内广泛使用。目前主流编程语言都有MD5实现,下面是java中MD5的使用:

    public static byte[] encode(String content) throws Exception{
            //获取MD5算法
            MessageDigest  md = MessageDigest.getInstance("MD5");
         
           //通过MD5中digest方法获取数字摘要 
            byte[] bytes = md.digest(content.getBytes("utf-8"));
         
            return bytes;
    
    }
    
    //原文 content:hello,world
    //生成的摘要(16进制编码后):22bd33d4c72d1986ccb4227ff7fle7265
    

      SHA算法:    

       SHA(Secure Hash Algorithm) 安全散列算法 其修订版本 SHA-1 是基于MD4算法的,是目前公认的安全散列算法之一,其生成摘要的长度为160位。由于摘要 长度比MD5长,运算过程更加复杂,因此在相同的硬件上,SHA-1的效率相对MD5较慢,但安全性更高。下面是Java中SHA-1的使用:

    public static byte[] encode(String content) throws Exception{
           //获取SHA-1
           MessageDigest md = MessageDigest.getInstance("SHA-1");
    
           //获取摘要
           byte[] bytes = md.digest(content.getBytes("utf-8"));
    
           return bytes;
    
    }
    
    //原文 content: hello,world
    //数字摘要(16进制编码后):deb945d3e6fe72dbla290bcfcf53057clcaafdel

     16进制编码:

    16进制由0-9和a-f表示,其中a-f对应10进制中的10-15

    java 实现16进制编码:

       /**
         * byte数组 转换成 16进制小写字符串
         */
        public static String bytes2Hex(byte[] bytes) {
            if (bytes == null || bytes.length == 0) {
                return null;
            }
    
            StringBuilder hex = new StringBuilder();
    
            for (byte b : bytes) {
                hex.append(HEXES[(b >> 4) & 0x0F]);
                hex.append(HEXES[b & 0x0F]);
            }
    
            return hex.toString();
        }
    

    java 实现16进制解码:

       /**
         * 16进制字符串 转换为对应的 byte数组
         */
        public static byte[] hex2Bytes(String hex) {
            if (hex == null || hex.length() == 0) {
                return null;
            }
    
            char[] hexChars = hex.toCharArray();
            byte[] bytes = new byte[hexChars.length / 2];   // 如果 hex 中的字符不是偶数个, 则忽略最后一个
    
            for (int i = 0; i < bytes.length; i++) {
                bytes[i] = (byte) Integer.parseInt("" + hexChars[i * 2] + hexChars[i * 2 + 1], 16);
            }
    
            return bytes;
        }
    

    Base64编码:

    很多人认为Base64是安全加密算法,并且将其当作加密算法使用,实际并非如此,因为任何人得到Base编码后的内容,通过相同的方法就可以得到原文信息。因此Base64只能算作编码算法。下面是java中base64的使用:

    //编码
    private static String encode(byte[] bytes) throws Exception{
               BASE64Encoder encoder = new BASE64Encoder();
    
               return encoder.encode(bytes);
    }
    
    //解码
    private static byte[] decode(String content) throws Exception{
               BASE64Dncoder decoder = new BASE64Dncoder();
    
               return dncoder.decode(content);
    }

    2.对称加密:

    数据发送方将密文(明文通过密钥加密的)和加密密钥一起经过特殊加密算法处理后,生成复杂的加密密文进行发送,数据接收方是收到密文后,若想读取数据,则需要使用加密使用的密钥及相同算法的逆算法对加密的密文进行解密,才能使其回复可读明文,在对称加密算法中,使用的密钥只有一个,发送和接收方都使用这个密钥进行加密和解密,这就要求发送方和接受方事先必须知道加密的密钥。

            

    对称加密算法特点:算法公开,计算量小,加密速度快,加密效率高。其安全性依赖于密钥,因此保护密钥不被泄露至关重要。

    常见的对称加密:AES,DES等。

    AES:

    AES(Advanced Encryption Standard)高级加密标准,用来替代DES算法,是对称加密算法中最流行的算法之一。主要特点:强安全性,高性能,高效率,易用灵活等特点。设计有3个密钥长度(128,192,256位)比DES更安全。

    java中AES算法的使用:

    /**
     * 生成base64编码的密钥字符串
     */ 
    public static String genKeyAes() throws Exception{
      //获取AEA生成器
      KeyGenerator  keyGen = KeyGenerator.getInstance("AES");
     
     //设置密钥位数
      keyGen.init(128);
     
    //获取密钥
      SecretKey key = kenGen.generateKey();
     
      //将密钥转成base64字符串 
     String base64Str = byte2Base64(key.getEncode()); 
    
    return base64Str ;
    
    }
    
    
    
    /**
     * 将base64编码格式的密钥字符串 转成 SecretKey对象
     */ 
    public static SecretKey loadKeyAES(String base64Str) throws Exception{
      //获取密钥
      byte[] bytes = base642byte(base64Str);
     
      //将密钥转成 SecretKey对象
      SecretKey key = new SecretKeySpec(bytes,"AES");
    
       return key;
    
    }

    加密与解密:

    /**
     * 对称加密
     */
    public static String encryptAES(String source,SecretKey key) throws Exception{
         //实例化对象cipher
         Cipher cipher = Cipher.getInstance("AES");
       
         //初始化加密模式
         cipher.init(Cipher.ENCRYPT_MODE,key);
         
        //得到加密字节数组
         byte[] bytes = cipher.dofinal(source.getBytes());
        
        //将加密字节数组 转成base64编码格式字符串
        String miwen = byte2Base64(bytes);
       
      return miwen ;
    
    }
    
    
    /**
     * 对称解密
     */
    public static String decryptAES(String source,SecretKey key) throws Exception{
         //实例化对象cipher
         Cipher cipher = Cipher.getInstance("AES");
       
         //初始化加密模式
         cipher.init(Cipher.DECRYPT_MODE,key);
         
        //得到原文字节数组
         byte[] bytes = cipher.dofinal(source.getBytes());
        
        //将原文字节数组 转成base64编码格式字符串
        String yuanwen = byte2Base64(bytes);
       
      return yuanwen;
    
    }

                   

    DES基于java的用法和AES一样 只是将上诉代码中的"AES"换成 DES即可 这里就不多赘述了。

    3.非对称加密:

    非对称加密:需要两把密钥,一把公钥,一把私钥。公钥加密对应私钥解密,私钥加密对应公钥解密。

    非对称加密算法实现信息交换的基本过程:

                                 

    非对称加密的特点:非对称加密的公钥是公开的,因此不需要在网络上传送密钥,大大提高了安全性,但非对称加密比对称加密复杂,加密速度相对较慢。

    因此广泛使用非对称与对称加密结合使用的方法,优缺点互补,达到时间与安全的平衡。对称加密速度快,用来加密较长的文件(明文),然后用非对称加密来给文件密钥加密。

    当前使用最广泛的非对称加密算法为RSA。

    基于java的RSA算法的使用:

    公钥和私钥字符串:

    /**
     *获取keyPair对象
     */ 
    public static keyPair getKeyPair() throws Exception{
            //获取RSA生成器
            KeyPairGenerator  k = KeyPairGenerator.getInstance("RSA");
            
            //初始化密钥长度
            k.initialize(512);
           
            //获取keyPair对象
            KeyPair keyPair = k.generateKeyPair();
     
            return keyPair;
    
    }
    
    
    /**
     *获取公钥字符串:通过keyPair对象
     */ 
    
     public static String getPublicKey(KeyPair keyPair){
           //公钥对象
           PublicKey publicKey = keyPair.getPublic(); 
           
           //公钥字节数组
           byte[] bytes = publicKey.getEncode();
           
           //公钥转成base64格式编码字符串
           return byte2Base64(bytes);
    
    }
    
    
    /**
     *获取私钥字符串:通过keyPair对象
     */ 
    
     public static String getPrivateKey(KeyPair keyPair){
           //私钥对象
           PrivateKey privateKey = keyPair.getPublic(); 
           
           //私钥字节数组
           byte[] bytes = privateKey .getEncode();
           
           //私钥转成base64格式编码字符串
           return byte2Base64(bytes);
    
    }
    

    通过公钥和私钥字符串获取公钥对象(PublicKey)和私钥对象(PrivateKey):

    /**
     *获取PublicKey 对象
     */
    public static  PublicKey string2PublicKey(String pubStr) throws Exception{
         //将base64编码的字符串 转成 字节数组公钥
         byte[] keyBytes = base642byte(pubStr);
    
         //将字节数组公钥转成 X509EncodeKeySpec 对象
         X509EncodeKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
       
        //获取KeyFactory
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    
        //获取PublicKey 对象
        PublicKey publicKey = keyFactory .generateFactory(keySpec);
    
       return publicKey;
    
    }
    
    
    /**
     *获取PrivateKey 对象
     */
    public static  PrivateKey string2PrivateKey (String priStr) throws Exception{
         //将base64编码的字符串 转成 字节数组公钥
         byte[] keyBytes = base642byte(priStr);
    
         //将字节数组公钥转成 X509EncodeKeySpec 对象
         PKCS8EncodeKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
       
        //获取KeyFactory
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    
        //获取PrivateKey 对象
        PrivateKey privateKey = keyFactory .generateFactory(keySpec);
    
       return privateKey ;
    
    }

    根据PublicKey与PrivateKey 进行加密和解密,这里使用公钥加密,私钥解密:

    /**
     *公钥加密
     */
    public static String publicEncrypt(String content,PublicKey publicKey) throws Exception{
       //获取Cipher对象
       Cipher cipher = Cipher.getInstance("RSA");
       
       //初始化加密模式
       cipher.init(Cipher.ENCRYPT_MODE,publicKey);
    
       //获取公钥加密的密文字节数组
       byte[] bytes = cipher.dofinal(content.getBytes());
    
       //转成bas64编码格式的字符串
       return byte2Base64(bytes); 
    
    
    }
    
    
    /**
     *私钥解密
     */
    public static String privateDecrypt(String content,PrivateKey privateKey) throws Exception{
       //获取Cipher对象
       Cipher cipher = Cipher.getInstance("RSA");
       
       //初始化加密模式
       cipher.init(Cipher.DECRYPT_MODE,privateKey);
    
       //获取公钥加密的密文字节数组
       byte[] bytes = cipher.dofinal(content.getBytes());
    
       //转成bas64编码格式的字符串
       return byte2Base64(bytes); 
    
    
    }

    4.数字签名

    数字签名是对非对称加密与数字摘要的综合使用,指的是将通信内容的摘要信息使用发送者的私钥进行加密。

    接收方通过发送者的公钥解密得到摘要信息,然后使用发送者相同的摘要算法对原文进行摘要,将两者摘要信息进行对比校验,判断原文是否被串改。

                          

    校验是否被串改过程:

    介绍完上面的各种加密算法后,来个支付包加密流程,是各种加密算法的综合运用:

                                    

    流程讲解:

          主要看加密包(发送的数据包)部分:分为信息,签名,会话密钥。

         信息:将原文通过会话密钥(对称加密的密钥)加密生成密文           (步骤1)

         签名:将原文通过MD5进行数字摘要,在对摘要使用信息发送方A的私钥加密 生成签名    (步骤2)

         会话密钥:其实就是对称加密的密钥,可以是AES。使用接收方B的公钥加密会话密钥      (步骤3)

        将加密包发送给信息接收方B:                              

          使用接收方B的私钥解密 得到会话密钥     (步骤4)

          使用会话密钥对信息进行解密 得到原文     (步骤5)

          将原文使用相同的摘要算法MD5 得到摘要A     (步骤6)

          使用发送方A的公钥解密数字签名 得到 摘要B    步骤6)

          校验摘要A与摘要B是否相等,不相等,说明原文被篡改。

    本文主要参考书籍:

                                                                                   

    展开全文
  • 文章目录5G安全算法测试caseNEA1 / EEA1算法测试case    输入参数:    输出参数:NEA2 / EEA2算法测试case    输入参数:    输出...

    博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持!
    博主链接

    本人就职于国际知名终端厂商,负责modem芯片研发。
    在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。


    博客内容主要围绕:
           5G协议讲解
           算力网络讲解(云计算,边缘计算,端计算)
           高级C语言讲解
           Rust语言讲解

    5G安全算法测试case


    NEA1 / EEA1算法测试case

        输入参数:

    • Key = (hex) EF A8 B2 22 9E 72 0C 2A 7C 36 EA 55 E9 60 56 95
    • Count = (hex) E28BCF7B
    • Bearer = (hex) 18
    • Direction = (hex) 0
    • Length = 510 bits
    • Plaintext = (hex) 10111231 E060253A 43FD3F57 E37607AB 2827B599 B6B1BBDA 37A8ABCC 5A8C550D 1BFB2F49 4624FB50 367FA36C E3BC68F1 1CF93B15 10376B02 130F812A 9FA169D8

        输出参数:

    • Ciphertext = (hex) E0DA15CA 8E2554F5 E56C9468 DC6C7C12 9C568AA5 032317E0 4E072964 6CABEFA6 89864C41 0F24F919 E61E3DFD FAD77E56 0DB0A9CD 36C34AE4 181490B2 9F5FA2FC

    NEA2 / EEA2算法测试case

        输入参数:

    • Key = (hex) d3c5d592 327fb11c 4035c668 0af8c6d1
    • Count = (hex) 398a59b4
    • Bearer = (hex) 15
    • Direction = (hex) 1
    • Length = 253 bits
    • Plaintext = (hex) 981ba682 4c1bfb1a b4854720 29b71d80 8ce33e2c c3c0b5fc 1f3de8a6 dc66b1f0

        输出参数:

    • Ciphertext = (hex) e9fed8a6 3d155304 d71df20b f3e82214 b20ed7da d2f233dc 3c22d7bd eeed8e78

    NEA3 / EEA3算法测试case

        输入参数:

    • Key = (hex) 17 3d 14 ba 50 03 73 1d 7a 60 04 94 70 f0 0a 29
    • Count = (hex) 66035492
    • Bearer = (hex) f
    • Direction = (hex) 0
    • Length = 193 bits
    • Plaintext: (hex) 6cf65340 735552ab 0c9752fa 6f9025fe 0bd675d9 005875b2 00000000

        输出参数:

    • Ciphertext: (hex) a6c85fc6 6afb8533 aafc2518 dfe78494 0ee1e4b0 30238cc8 00000000

    NIA1 / EIA1算法测试case

        输入参数:

    • IK = (hex) 2bd6459f 82c5b300 952c4910 4881ff48
    • Count-I = (hex) 38a6f056
    • Bearer = (hex) 1f
    • Direction = (hex) 0
    • Message = (hex) 33323462 63393861 37347900 00000000
    • Length = 88 bits

        输出参数:

    • MACT = (hex) 731f1165

    NIA2 / EIA2算法测试case

        输入参数:

    • IK = (hex) 84be6ebc 300b8430 3329bddd 12c6e1e5
    • Count-I = (hex) 0
    • Bearer = (hex) 1
    • Direction = (hex) 1
    • Message = (hex) 00 7E005D02 0002F070 E1360102
    • Length = 104 bits

        输出参数:

    • MACT = (hex) 43f41790

    NIA3 / EIA3算法测试case

        case1 输入参数:

    • Key = (hex) 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    • Count = (hex) 0
    • Bearer = (hex) 0
    • Direction = (hex) 0
    • Length = 1 bits
    • Message = (hex) 00000000

        case1 输出参数:

    • MAC = (hex) c8a9595e

        case2 输入参数:

    • Key = (hex) c9 e6 ce c4 60 7c 72 db 00 0a ef a8 83 85 ab 0a
    • Count = (hex) a94059da
    • Bearer = (hex) a
    • Direction = (hex) 1
    • Length = 577 bits
    • Message = (hex) 983b41d4 7d780c9e 1ad11d7e b70391b1 de0b35da 2dc62f83 e7b78d63 06ca0ea0 7e941b7b e91348f9 fcb170e2 217fecd9 7f9f68ad b16e5d7d 21e569d2 80ed775c ebde3f40 93c53881 00000000

        case2 输出参数:

    • MAC = (hex) fae8ff0b

    KRRCenc算法测试case

    RRCenc 、NASenc、UPenc的衍生使用的是同一个算法,所以这里只给出了一个测试case。

        输入参数:

    • Algorithm = 0(对应算法nea0)
    • Kgnb = (hex)E67845C9 8DCD7297 8E5EB6DD 6523F20F 9F3BB963 275D0745 37E8E0BB B99ADDB7

        输出参数:

    • KRRCenc = (hex)617DD9BC 84ECA1B5 A14A0DB5 EE33736B

    KRRCint算法测试case

    RRCint 、NASint、UPint的衍生使用的是同一个算法,所以这里只给出了一个测试case。

        输入参数:

    • Algorithm = 2 (对应算法nia2)
    • Kgnb = (hex)E67845C9 8DCD7297 8E5EB6DD 6523F20F 9F3BB963 275D0745 37E8E0BB B99ADDB7

        输出参数:

    • KRRCint = (hex)F937E5AB 0228D92D 894910ED 333EDECB

    CK’ IK’ 算法测试case

        输入参数:

    • Server name = “WLAN”
    • Server name length = 4
    • CK = (hex)5349 fbe0 9864 9f94 8f5d 2e97 3a81 c00f
    • IK = (hex)9744 871a d32b f9bb d1dd 5ce5 4e3e 2e5a
    • AUTN = (hex)bb52 e91c 747a c3ab 2a5c 23d1 5ee3 51d5

        输出参数:

    • CK’ = (hex)0093 962d 0dd8 4aa5 684b 045c 9edf fa04
    • IK’ = (hex)ccfc 230c a74f cc96 c0a5 d611 64f5 a76c

    EMSK 算法测试case

        输入参数:

    • Identity = “0555444333222111”
    • CK’ = (hex)0093 962d 0dd8 4aa5 684b 045c 9edf fa04
    • IK’ = (hex)ccfc 230c a74f cc96 c0a5 d611 64f5 a76c

        输出参数:

    • EMSK = (hex)f861 703c d775 590e 16c7 679e a387 4ada 8663 11de 2907 64d7 60cf 76df 647e a01c 313f 6992 4bdd 7650 ca9b ac14 1ea0 75c4 ef9e 8029 c0e2 90cd bad5 638b 63bc 23fb

    Kgnb 算法测试case

    关于 Kausf、Kseaf、Kgnb*、Kamf、NH 密钥的衍生,与Kgnb使用的是相同的算法,所以只给出一个测试case。

        输入参数:

    • Kamf = (hex)856ab69a 2a195d9e 87ec15e9 c5c022bb f72d4aa3 65367cf4 2a3013be 1f4a29ca
    • nas_ul_count = 0
    • key_type = 0(对应 N_3GPP_ACCSESS)

        输出参数:

    • Kgnb = (hex)D293B8F0 512412DF D23B8DE7 4A2FFF30 982DE530 3585AF06 0F5487DD B352DA42

    《Snow 3G算法源码介绍》
    《128-bit AES算法源码介绍》
    《ZUC算法源码介绍》

    【5G/4G】128-EEA1与128-NEA1算法详解
    【5G/4G】128-EEA2与128-NEA2算法详解
    【5G/4G】128-EEA3与128-NEA3算法详解

    【5G/4G】128-EIA1与128-NIA1算法详解
    【5G/4G】128-EIA2与128-NIA2算法详解
    【5G/4G】128-EIA3与128-NIA3算法详解


    在这里插入图片描述

    展开全文
  • 安全算法

    千次阅读 2016-12-18 11:48:51
    常用的安全算法主要包括数字摘要、对称加密算法、非对称加密算法、信息编码等。  一、数字摘要  数字摘要也称为消息摘要,它是唯一对应一个消息或文本的固定长度的值,它由一个单向Hash函数对消息进行计算而产生。...
  • 信息安全是近年来的热门话题,特别是最近随着物联网的全民化,安全已经成为移动支付,智能家居等领域...目前遇到的很多比特币钱包被盗,手机支付被盗刷等都与算法相关,读完本文,就可以让你成为安全算法领域的专家。
  • 安全算法梳理

    千次阅读 2016-09-05 01:12:15
      经常见到RSA、MD5、SHA系列算法,另外还有数字摘要、数字签名、数字证书等名词,以及对称加密与非对称加密。他们之间到底是什么关系呢?下面就通过这篇文章来梳理一下。 一、加密算法  加密算法,简而言之...
  • 通常情况下,在CANoe的Diagnostics/ISOTPConfiguration对话框中加载诊断描述文件(cdd、pdx、mdx等)后,我们就可以在诊断控制台(Diagnostic Console)面板里进行诊断服务的相关操作,但是在处理安全访问时就不能...
  • 当安全遇上AI 阿里聚安全算法挑战赛 队伍经验分享

    万次阅读 多人点赞 2020-04-05 20:55:27
      本届线上选拔赛赛题包括了《人机行为识别》、《SQL注入检测》和《社区反垃圾》,首次把风控、网络安全及内容安全的多维度数据结合的算法比赛。赛题紧贴业务,将实际存在的一些难题和数据呈现出来。《人机行为...
  • 什么是DES安全算法

    千次阅读 2016-04-20 13:58:32
    http://baike.baidu.com/link?url=a8RxsKgXSz3MIQNqzEjvxsIiTD7w5k171bi-KdPKH31aEu-9YWZ8PVBegLeO1oNYBbzw-tYKicuVl3quFTfXAqDES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,...
  • CANoe诊断功能——安全算法调用介绍

    千次阅读 2020-08-14 14:28:23
    通常情况下,在CANoe中加载诊断数据库cdd文件后,我们就可以在DiagnosticConsole诊断面板里进行安全访问相关操作。但是至少要需要手动依次触发3个诊断命令(如下图):扩展模式切换(10 03)- 请求种子(27 03)-...
  • 国产密码安全算法总结

    万次阅读 多人点赞 2017-03-09 17:41:21
    算法是由国家密码管理局编制的一种商用密码分组标准对称算法,分组长度和密钥长度均为128位,算法安全保密强度及相关软硬件实现性能与AES算法相当,目前该算法尚未公开,仅以IP核的形式存在于芯片中。2、SM2算法...
  • 死锁算法:银行家算法安全算法 借鉴了一些文章,自己总结了一下 银行家算法 首先,算法的核心在于,每次进程申请资源时,都会进行一次试探性分配,若成功,则真实分配。 基本思想: 在每个新进程进入系统时,他...
  • 操作系统中的银行家算法安全算法

    千次阅读 多人点赞 2020-11-15 22:05:07
    银行家算法属于避免死锁的一个著名算法,由Dijkstra在1965年为T.H.E系统设计的一种避免死锁产生的算法。这是由于该算法用于银行系统现金贷款的发放而得名。 一 系统安全状态 指系统能按照某种顺序如<P1,P2,…,Pn&...
  • 常见的安全算法

    万次阅读 2017-03-28 10:00:36
    本文整理了常见的安全算法,包括MD5、SHA、DES、AES、RSA等,并写了完整的工具类(Java 版),工具类包含测试。一、数字摘要算法 数字摘要也称为消息摘要,它是一个唯一对应一个消息或文本的固定长度的值,它由一个...
  • 安全算法—Hash算法总结(一)

    千次阅读 2018-07-10 16:37:34
    Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远...
  • 安全算法—SHA-1算法

    千次阅读 2018-07-11 10:42:06
    SHA-1(英语:Secure Hash Algorithm 1,中文名:安全散列算法1)是一种密码散列函数,美国国家安全局设计,并由美国国家标准技术研究所(NIST)发布为联邦数据处理标准(FIPS)。SHA-1可以生成一个被称为消息摘要的...
  • 常见的安全算法--单向加密--Hash算法

    千次阅读 2019-07-25 11:31:17
    常见安全算法—数字摘要 数字摘要也称为消息摘要,它是一个唯一对应一个消息或文本的固定长度的值,它由一个单向 Hash函数对消息进行计算而产生。如果消息在传递的途中改变了,接收者通过对收到消息采用相同的Hash...
  • 常见安全算法-对称加密

    千次阅读 2019-07-25 10:03:19
    数据)和加密密钥一起经过特殊加密算法处理后,生成复杂的加密密文进行发送,数据接收方收到密文后,若想读取原文,则需要使用加密使用的密钥及相同算法的逆算法对加密的密文进行解密,才能使其恢复成可读明文。...
  • 银行家算法安全算法笔记

    万次阅读 多人点赞 2018-07-01 15:57:55
    银行家算法简框图 “`flow st=&amp;amp;gt;start: 开始 e=&amp;amp;gt;end: 结束 cond1=&amp;amp;gt;condition: 资源请求合法性检查 op1=&amp;amp;gt;operation: 进行尝试性的资源分配 op2=&...
  • 密码学中可证明安全 可证明安全理论基础: 一般来讲,可证明安全是指利用数学中的反证法思想...极微本原:密码原语,是指安全方案或者协议的最基本组成构建或者模型,例如某个基础密码算法或者数学难题。 步骤: (1)
  • 安全算法—SHA-256算法

    千次阅读 2018-07-15 14:39:47
    1. 什么是SHA-256?SHA-256是SHA2中的一种。对于长度L(L&...2. SHA-256算法实现步骤2.1 把消息转换为位字符串 SHA-256算法是按照位作为输入,所以进行计算前必须把原始消息(比如字符串、文件等)...
  • 银行家算法找出所有安全序列.cpp银行家算法找出所有安全序列.cpp银行家算法找出所有安全序列.cpp银行家算法找出所有安全序列.cpp银行家算法找出所有安全序列.cpp银行家算法找出所有安全序列.cpp银行家算法找出所有...
  • 密码学安全算法--对称加密算法

    千次阅读 2017-06-04 21:45:50
    最常见对称加密算法是:DES、3DES、AES、RC4。 对称加密算法基本原理 先上图,对称加密工作过程 在整个工作过程中涉及到以下几个概念 - 明文:也就是原始信息或者说原始数据。也就是上图中的A。 - 加密算法...
  • 安全的加密算法

    千次阅读 2021-03-24 14:32:15
    安全的加密算法 SKIPJACK\RC4\RSA(1024位以下) des、md2、md4、md5
  • 互联网给人们生活带来便利的同时也隐含了大量不良信息,防范互联网平台有害内容传播引起了多方面的高度关注。本次演讲从技术层面分享网易易盾在内容安全领域的算法实践经验,包括深度...
  • 欢迎新同学的光临 … … 人若无名,便可专心练剑 我不是一条咸鱼,而是一条死鱼啊! 0x01 前言 车机渗透,博主感觉大致可分为:软件层、系统层、硬件层 ...例如,连接一些车机WI-FI时,为了安全考虑会要求输入PIN.
  • 摘要算法和加密算法

    千次阅读 2022-04-01 14:04:16
    概要算法和加密算法的讲解与比较
  • 操作系统 银行家算法 安全性检查

    千次阅读 2020-11-22 11:05:47
    文章目录算法描述银行家算法安全性检查数据结构安全算法银行家算法主函数测试用例 算法描述 银行家算法 设进程I提出请求Request[N],则银行家算法按如下规则进行判断 如果Request[N]<= Need [I, N],则转(2);...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 732,377
精华内容 292,950
关键字:

安全算法

友情链接: en.i-cube_lrwan.zip