加解密随笔

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 加解密随笔

对称算法

对称算法使用一个密钥。给定一个明文和一个密钥,加密产生密文,其长度和明文大致相同。解密时,使用读密钥与加密密钥相同。 对称算法主要有四种加密模式:

电子密码本模式 Electronic Code Book(ECB)

这种模式是最早采用和最简单的模式,它将加密的数据分成若干组,每组的大小跟加密密钥长度相同,然后每组都用相同的密钥进行加密。其缺点是:电子编码薄模式用一个密钥加密消息的所有块,如果原消息中重复明文块则加密消息中的相应密文块也会重复,因此,电子编码薄模式适于加密小消息。

加密块链模式 Cipher Block Chaining(CBC)

CBC模式的加密首先也是将明文分成固定长度的块,然后将前面一个加密块输出的密文与下一个要加密的明文块进行异或操作,将计算结果再用密钥进行加密得到密文。第一明文块加密的时候,因为前面没有加密的密文,所以需要一个初始化向量。跟ECB方式不一样,通过连接关系,使得密文跟明文不再是一一对应的关系,破解起来更困难,而且克服了只要简单调换密文块可能达到目的的攻击。

加密反馈模式 Cipher Feedback Mode(CFB)

面向字符的应用程序的加密要使用流加密法,可以使用加密反馈模式。在此模式下,数据用更小的单元加密,如可以是8位,这个长度小于定义的块长(通常是64位)。其加密步骤是:


使用64位的初始化向量。初始化向量放在移位寄存器中,在第一步加密,产生相应的64位初始化密文;

始化向量最左边的8位与明文前8位进行异或运算,产生密文第一部分(假设为c),然后将c传输到接收方;

向量的位(即初始化向量所在的移位寄存器内容)左移8位,使移位寄存器最右边的8位为不可预测的数据,在其中填入c的内容;

第1-3步,直到加密所有的明文单元。

解密过程相反

输出反馈模式 Output Feedback Mode(OFB)

输出反馈模式与 CFB 相似,惟一差别是, CFB 中密文填入加密过程下一阶段,而在 OFB中,初始化向量加密过程的输入填入加密过程下一阶段。


摘要算法

       摘要算法是一种能产生特殊输出格式的算法,这种算法的特点是:无论用户输入什么长度的原始数据,经过计算后输出的密文都是固定长度的,这种算法的原理是根据一定的运算规则对原数据进行某种形式的提取,这种提取就是摘要,被摘要的数据内容与原数据有密切联系,只要原数据稍有改变,输出的“摘要”便完全不同,因此,基于这种原理的算法便能对数据完整性提供较为健全的保障。但是,由于输出的密文是提取原数据经过处理的定长值,所以它已经不能还原为原数据,即消息摘要算法是不可逆的,理论上无法通过反向运算取得原数据内容,因此它通常只能被用来做数据完整性验证。如今常用的“消息摘要”算法经历了多年验证发展而保留下来的算法已经不多,这其中包括MD2、 MD4、 MD5、SHA、 SHA-1/256/383/512等。常用的摘要算法主要有MD5和SHA1。 D5的输出结果为16字节, sha1的输出结果为20字节。

公钥算法

       在公钥密码系统中,加密和解密使用的是不同的密钥,这两个密钥之间存在着相互依存关系:即用其中任一个密钥加密的信息只能用另一个密钥进行解密。这使得通信双方无需事先交换密钥就可进行保密通信。其中加密密钥和算法是对外公开的,人人都可以通过这个密钥加密文件然后发给收信者,这个加密密钥又称为公钥;而收信者收到加密文件后,它可以使用他的解密密钥解密,这个密钥是由他自己私人掌管的,并不需要分发,因此又成称为私钥,这就解决了密钥分发的问题。主要的公钥算法有: RSA、 DSA、 DH和ECC。

RSA 算法

       当前最著名、应用最广泛的公钥系统RSA是在1978年,由美国麻省理工学院(MIT)的Rivest、 Shamir和Adleman在题为《获得数字签名和公开钥密码系统的方法》的论文中提出的。它是一个基于数论的非对称(公开钥)密码体制,是一种分组密码体制。其名称来自于三个发明者的姓名首字母。 它的安全性是基于大整数素因子分解的困难性,而大整数因子分解问题是数学上的著名难题,至今没有有效的方法予以解决,因此可以确保RSA算法的安全性。 RSA系统是公钥系统的最具有典型意义的方法,大多数使用公钥密码进行加密和数字签名的产品和标准使用的都是RSA算法。 RSA算法是第一个既能用于数据加密也能用于数字签名的算法,因此它为公用网络上信息的加密和鉴别提供了一种基本的方法。它通常是先生成一对RSA 密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册,人们用公钥加密文件发送给个人,个人就可以用私钥解密接受。为提高保密强度, RSA密钥至少为500位长,一般推荐使用1024位。RSA算法是R.Rivest、 A.Shamir和L.Adleman于1977年在美国麻省理工学院开发,于1978年首次公布。 RSA公钥密码算法是目前网络上进行保密通信和数字签名的最有效的安全算法之一。 RSA算法的安全性基于数论中大素数分解的困难性,所以, RSA需采用足够大的整数。因子分解越困难,密码就越难以破译,加密强度就越高。其算法如下:


选择两质数p、 q

计算n = p * q

计算n的欧拉函数Φ(n) = (p - 1)(q - 1)

选择整数e,使e与Φ(n)互质,且1 < e < Φ(n)

计算d,使d * e = 1 mod Φ(n)

其中,公钥KU={e, n},私钥KR={d, n}。

加密/解密过程:

利用RSA加密,首先需将明文数字化,取长度小于log2n位的数字作为明文块。

对于明文块M和密文块C,加/解密的形式如下:

加密: C = Me mod n

解密: M = Cd mod n = (Me)d mod n = Med mod n

RSA的安全性基于大数分解质因子的困难性。因为若n被分解为n = p * q,则Φ(n)、 e、 d可依次求得。目前,因式分解速度最快的方法的时间复杂性为exp(sqrt(ln(n)lnln(n)))。 统计数据表明,在重要应用中,使用512位的密钥已不安全,需要采用1024位的密钥。

DSA 算法

       DSA(Digital Signature Algorithm,数字签名算法,用作数字签名标准的一部分),它是另一种公开密钥算法,它不能用作加密,只用作数字签名。 DSA使用公开密钥,为接受者验证数据的完整性和数据发送者的身份。它也可用于由第三方去确定签名和所签数据的真实性。 DSA算法的安全性基于解离散对数的困难性,这类签字标准具有较大的兼容性和适用性,成为网络安全体系的基本构件之一。DSA签名算法中用到了以下参数:

p是L位长的素数,其中L从512到1024且是64的倍数。

q是160位长且与p-1互素的因子 ,其中h是小于p-1并且满足 大于1的任意数。

x是小于q的数。


另外,算法使用一个单向散列函数H(m)。标准指定了安全散列算法(SHA)。三个参数p, q和g是公开的,且可以被网络中所有的用户公有。私人密钥是x,公开密钥是y。

对消息m签名时:


发送者产生一个小于q的随机数k。

发送者产生:r和s就是发送者的签名,发送者将它们发送给接受者。

接受者通过计算来验证签名:如果v=r,则签名有效。


Diffie-Hellman 密钥交换

       DH算法是W.Diffie和M.Hellman提出的。此算法是最早的公钥算法。它实质是一个通信双方进行密钥协定的协议:两个实体中的任何一个使用自己的私钥和另一实体的公钥,得到一个对称密钥,这一对称密钥其它实体都计算不出来。 DH算法的安全性基于有限域上计算离散对数的困难性。离散对数的研究现状表明:所使用的DH密钥至少需要1024位,才能保证有足够的中、长期安全。

椭圆曲线密码体制(ECC)

       1985年, N. Koblitz和V. Miller分别独立提出了椭圆曲线密码体制(ECC),其依据就是定义在椭圆曲线点群上的离散对数问题的难解性。为了用椭圆曲线构造密码系统,首先需要找到一个单向陷门函数,椭圆曲线上的数量乘就是这样的单向陷门函数。椭圆曲线的数量乘是这样定义的:设E为域K上的椭圆曲线, G为E上的一点,这个点被一个正整数k相乘的乘法定义为 k个G相加,因而有


kG = G + G + … + G (共有k个G)


       若存在椭圆曲线上的另一点N ≠ G,满足方程kG = N。容易看出,给定k和G,计算N相对容易。而给定N和G,计算k = logG N相对困难。这就是椭圆曲线离散对数问题。离散对数求解是非常困难的。椭圆曲线离散对数问题比有限域上的离散对数问题更难求解。对于有理点数有大素数因子的椭圆离散对数问题,目前还没有有效的攻击方法。

openssl_百度百科

https://github.com/openssl/openssl 官网

https://github.com/openssl/openssl/blob/openssl-3.0.7/NOTES-WINDOWS.md

https://github.com/openssl/openssl/blob/openssl-3.0.7/NOTES-UNIX.md


https://github.com/openssl/openssl/blob/openssl-3.0.7/NOTES-ANDROID.md

Openssl加密库_小o魂的博客-CSDN博客_openssl库

OpenSSL 3.0 - OpenSSLWiki

OpenSSL 3.0 RSA_钞sir的博客-CSDN博客

C语言——基于OpenSSL 的RSA 签名验签算法_m0_61283489的博客-CSDN博客_openssl rsa签名

openssl从内存加载证书、私钥、证书链_BalrogMirthrandir的博客-CSDN博客_openssl证书链

openssl3.0 加密算法库编程精要 05 详解 EVP API 公开密钥密码算法 生成密钥对 - 走看看

RSA详解_buzul的博客-CSDN博客_rsa参数

openssl之windows编译_jaronho的博客-CSDN博客_openssl windows编译

openssl在Windows系统下的编译_冷月9854的博客-CSDN博客_windows编译openssl

EVP_PKEY_verify_recover

使用openssl库EVP编程计算sha256值_雜貨鋪老闆的博客-CSDN博客_evp_sha256

EVP系列函数介绍 | 吴俊杰的技术日志

openssl evp 哈希算法(md5,sha1,sha256) - 走看看  

概述 | Virbox LM 产品文档

软件加密锁_加密狗_加密及授权管理平台—深盾科技【官网】

Virbox LM 开发者中心

conan-c++包管理工具安装及使用指南_早睡的叶子的博客-CSDN博客_conan

JFrog ConanCenter - The Central Repository for C / C++ packages

Install — conan 1.55.0 documentation

conan入门(一):conan 及 JFrog Artifactory 安装_10km的博客-CSDN博客_conan 安装

在linux下获取硬盘序列号 - 陌鉎こ城sHi - 博客园

目前最好用的linux下获取网卡物理地址的方法_鸠摩智首席音效师的博客-CSDN博客_linux查看网卡位置

Linux下获取CPUID、硬盘序列号与MAC地址 - 百度文库

C/C++获取安卓手机IMEI编号demo_J6wuli的博客-CSDN博客_c语言获取imei

android在ndk/jni的cc/c ++中获取imei - IT屋-程序员软件开发技术分享社区

纯C代码获取android硬件信息和系统信息,不依赖JNI - 百度文库

android ndk开发教程(android 获取serialno_NDK 获取android的imei和serial number)-天道酬勤-花开半夏

ndk获取android id,Android通过NDK获取Keystore签名值_文献工匠的博客-CSDN博客

使用Android NDK获取ANDROID_ID - 陈旧的本地引用错误(Get ANDROID_ID using Android NDK - stale local reference error)_电脑培训

Android--史上最全、最完整,获取设备信息、获取手机唯一标识_怀君的博客-CSDN博客_android 获取设备信息

iphone adb android,adb shell dumpsys iphonesubinfo从Android 5.0 Lollipop起不起作用_weixin_39667398的博客-CSDN博客

获取设备唯一标识_余音流川的博客-CSDN博客_获取设备标识

Android系统属性和设置项读取 - 简书

Android的系统属性(SystemProperties)分析BobsBlo... - 百度文库

NativeCode中通过JNI反射调用Java层的代码,以获取IMEI为例 | Java


CA证书、自颁发证书、自签名证书联系 - KylinZhuang - 博客园

关于PEM, DER, CRT, CER,KEY等各类证书与密钥文件后缀的解释_bluishglc的博客-CSDN博客_crt文件

openssl生成证书_一只揪°的博客-CSDN博客_openssl 生成证书

生成自签名证书:生成证书和秘钥_于雷【星硕世纪】的博客-CSDN博客_生成自签名证书

httplib库的使用(支持http/https)(一)_秋杪的博客-CSDN博客_httplib

httplib 库介绍与使用_houxian1103的博客-CSDN博客_httplib

HTTPS请求过程图解_勇敢的打工人海励的博客-CSDN博客_https请求过程

Https请求原理和步骤总结_qq_32940999的博客-CSDN博客_https请求原理

目录
相关文章
|
6月前
|
数据安全/隐私保护
使用加密工具类进行有效的字符串加密——CSDN博客
使用加密工具类进行有效的字符串加密——CSDN博客
|
4月前
|
移动开发 数据安全/隐私保护 Python
100行代码手把手带你实现Feisitel加密算法
Feistel 加密算法,或者叫做 Feistel 网络,是一种块加密(block cipher)模型,很多常见的加密算法都具有 Feistel 结构,如 DES、blowfish 等。 Feistel 将明文分割成固定大小(block size)的块(如 32bit、64bit),然后对于每个块进行若干轮操作,每轮操作需要用到一个 key,因此总计需要循环轮数个 key。解密时需要用相同的 keys,因此这是一种对称加密算法。
|
4月前
|
前端开发 安全 JavaScript
学习前端加密
【7月更文挑战第3天】前端加密保护数据安全,防止传输中被截获,提升用户体验。HTTPS基础保障,JavaScript库如CryptoJS辅助加密,Web Crypto API提供原生加密功能。但前端加密非万能,需结合后端措施,注意算法选择、密钥管理。
67 2
|
6月前
|
算法 JavaScript Java
安卓逆向 -- 算法基础(数字签名)
安卓逆向 -- 算法基础(数字签名)
53 1
|
6月前
|
Shell 数据安全/隐私保护
加密解密工具
加密解密工具
166 1
|
6月前
|
存储 监控 前端开发
前端知识笔记(五)———前端密钥怎么存储,才最安全?
前端知识笔记(五)———前端密钥怎么存储,才最安全?
1362 0
|
编解码 前端开发 算法
前端CryptoJS和Java后端数据互相加解密(AES)
最近刚好在做一个简单的保险代理人运营平台,主要是为了方便个人展业,由于有些客户数据比较敏感,所以在用户登录时准备对登录密码进行一波加密后再传输。
前端CryptoJS和Java后端数据互相加解密(AES)
|
JavaScript 前端开发 数据安全/隐私保护
js前端使用AES加解密及在线解密工具验证
js前端使用AES加解密及在线解密工具验证
744 0
js前端使用AES加解密及在线解密工具验证
|
算法 安全 数据安全/隐私保护
非对称加密加密原理和开发场景解析
过上一节,就能很好的理解非对称加密就是加密和解密双方使用的是不同的密钥。比喻就是:一把锁,如果被A用钥匙锁上了,那么A无法继续使用自己的钥匙打开,只能让B用他的钥匙打开。而如果B用钥匙把锁给锁上之后,同样必须只有A的钥匙才能打开。所以非对称加密主要解决的问题就是:可信问题,防窃听问题。
728 0
|
安全 算法 大数据
对称加密加密原理和开发场景解析
加密是自古以来人们都在不断使用的技术,目的是为了隐藏信息,只是随着时代在不断的变化,加密也在不断的更新。从古代的藏宝图对藏宝地点进行隐藏。到二战时候,破译敌方电台,都是属于加密和破解的过程。进入21世纪后,加密在互联网时代也有了新的加密方法。也创造了密码学这个学科。目前在加密的场景下,通常分为:可逆加密和不可逆加密。而在可逆加密场景里又分为:对称加密和非对称加密。本次主要讨论集中在可逆加密上。可逆加密顾名思义就是在对明文进行加密后生成密文,能够通过解密把密文再还原成明文。数据加密一般主要解决三个问题:可信问题(非对称加密可解决),防篡改问题(不可逆加密解决),防窃听问题...
387 0