密码学

AES 加密算法的原理详解

本秂侑毒 提交于 2019-12-02 01:56:27
AES 加密算法的原理详解 本教程摘选自 https://blog.csdn.net/qq_28205153/article/details/55798628 的原理部分。 AES简介 高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的)。对称加密算法也就是加密和解密用相同的密钥,具体的加密流程如下图: 下面简单介绍下各个部分的作用与意义: · 明文P 没有经过加密的数据。 · 密钥K 用来加密明文的密码,在对称加密算法中,加密与解密的密钥是相同的。密钥为接收方与发送方协商产生,但不可以直接在网络上传输,否则会导致密钥泄漏,通常是通过非对称加密算法加密密钥,然后再通过网络传输给对方,或者直接面对面商量密钥。密钥是绝对不可以泄漏的,否则会被攻击者还原密文,窃取机密数据。 · AES加密函数 设AES加密函数为E,则 C = E(K, P),其中P为明文,K为密钥,C为密文。也就是说,把明文P和密钥K作为加密函数的参数输入,则加密函数E会输出密文C。 · 密文C 经加密函数处理后的数据 · AES解密函数 设AES解密函数为D,则 P = D(K, C),其中C为密文,K为密钥,P为明文。也就是说,把密文C和密钥K作为解密函数的参数输入,则解密函数会输出明文P。

浅谈密码学中数论基础

匆匆过客 提交于 2019-12-02 01:12:23
浅谈密码学中数论基础 1.模运算1765243235 模运算也可以称为取余运算,例如 23≡11(mod12),因此如果a=kn+b,也可以表示为a ≡ b(mod n),运算规则: (a+b) mod n = ((a mod n) + (b mod n))mod n (a*b) mod n = ((a mod n) * (b mod n)) mod n 完全剩余集合 1~n-1构成了自然数n的完全剩余集合,对于任意一个整数m%n都存在于1~n的集合中。 构造加法链 在加密算法中,运用到了大量的取模运算,对于一个k位数模n,所有的运算例如加减乘除中间结构将不会超过2k位,因此例如a x mod n将会大大简化计算时的复杂度。 例如a 8 mod n 在计算时可以这样计算 ((a 2 mod n) 2 mod n) 2 mod n 当指数x不是2的倍数时则需要构造加法链,例如25,25 = 16 + 8 +1 = 2 4 + 2 3 + 2 0 因此a 25 mod n = (a * a 8 * a 16 ) mod n = ((((a 2 * a) 2 ) 2 ) 2 *a)mod n C语言表示 unsigned long ss(unsigned long x , unsigned long y , unsigned long n) { unsigned long s,t,u;

C# 网络加密与解密

天涯浪子 提交于 2019-12-01 13:20:29
     数据在网络传输过程中的保密性是网络安全中重点要考虑的问题之一。由于通过网络传递数据是在不安全的信道上进行传输的,因此通信双方要想确保任何可能正在侦听的人无法理解通信的内容,而且希望确保接收方接收的信息没有在传输期间被任何人修改,最好的办法就是在传输数据前对数据进行加密,接收方接收到加密的数据后再进行解密处理,从而保证数据的安全性。   在.NET 库的System.Security.Cryptography 命名空间中,包含多种加密数据的类,涉及多种加密算法。加密方法主要分为两大类:对称加密和不对称加密。 1 对称加密   对称加密也称为私钥加密,采用私钥算法,加密和解密数据使用同一个密钥。由于具有密钥的任意一方都可以使用该密钥解密数据,因此必须保证该密钥不能被攻击者获取,否则就失去了加密的意义。   私钥算法以块为单位加密数据,一次加密一个数据块。因此对称加密支持数据流,是加密流数据的理想方式。   .NET 类库使用的私钥算法有RC2、DES、TripleDES 和Rijndael。这些算法通过加密将n字节的输入块转换为加密字节的输出块。如果要加密或解密字节序列,必须逐块进行。由于n很小(对于RC2、DES 和TripleDES 算法,n 的值为8 字节、16 字节或24 字节,默认值为16字节;对于Rijndael 算法,n 的值为32 字节)

逆元(数论倒数)【密码学笔记】

本小妞迷上赌 提交于 2019-12-01 07:05:57
数论倒数,又称逆元 取模 对于取模,有一下一些性质: 但是唯独除法是不满足的: 为什么除法错的呢?很好证明: 而对于一些题目,我们必须在中间过程中进行求余,否则数字太大,电脑存不下,那如果这个算式中出现除法,我们就需要逆元了。 逆元 定义: 我们知道,如果a*x = 1,那么x是a的倒数,x = 1/a 而在数论问题中,大部分情况都有取模,所以问题就变成了: 那么x就不一定等于1/a了 所以这时候,我们就把x理解为在模p空间下,a的倒数,满足: 现在就要在回到刚才的问题了,除以一个数等于乘上这个数的倒数,在除法取余的情况下,就是乘上这个数的逆元,即: 这样就把除法,完全转换为乘法了。 逆元的求解 对于逆元的求解,如果n较小的话,是容易算出来的,例如,求3在模26下的逆元: 但是当n非常大的时候,就需要引入一个算法来计算 (1)扩展欧几里得算法(extend_gcd) 对于逆元的表达式可以做一些变换: 当gcd(a,n)=1时,代入extend_gcd(a,b,x,y),得到的非负的x值,就是a对模n的逆元。 算法实现与证明 也就是说,我们得到了一个和gcd算法中,gcd(m,n)=gcd(n,m%n)相似的恒等式 什么意思呢?举个例子,就是 如果想要x为正值 只再做一步: if (x < 0) { x += b; y -= a; } 扩展: 完整算法: int extend_gcd

替换密码技术【密码学笔记】

心不动则不痛 提交于 2019-12-01 04:34:16
概念   替换密码是基于符号替换的密码技术,以符号的置换来达到掩盖文明信息的目的。 1、单字符单表替换密码技术 单表单字符的含义是对明文中所有的字符都使用一个固定的映射,即: 任何明文加密、密文解密均使用同一个密码表。 明文中相同的字母,必被加密成相同的密文字母。 (1)乘法密码技术 乘法密码技术的密匙是k。k满足gcd(k,n)=1,若n为素数,则有n-2个密匙(k=1是恒等变换,即加密后的密文和明文是一样的,应当舍弃);若n不是素数,则有φ(n)-1个密匙(同样是舍弃了为1的情况)。 解密变换中的 k -1 为 k 对模 n 的逆,满足:    所以,在已知密匙的情况下,k -1 是可以求出来的。 【例1】 英文字母 n = 26,取密匙 k = 9。 明文:m = a man liberal in his views 密文:c = a ean vujkxav un lug hukqg 根据k=9,n=26可以求出来k -1 为3。 测试代码: #include <iostream> #include <string> #include <stdio.h> #include <vector> #include <algorithm> #include <fstream> using namespace std; char encypt(char c) { if (c != '

浅谈密码学中数论基础

三世轮回 提交于 2019-11-30 06:40:38
1.模运算(mod) 模运算也可以称为取余运算,例如 23≡11(mod12),因此如果a=kn+b,也可以表示为a ≡ b(mod n),运算规则: (a+b) mod n = ((a mod n) + (b mod n))mod n (a*b) mod n = ((a mod n) * (b mod n)) mod n 完全剩余集合 1~n-1构成了自然数n的完全剩余集合,对于任意一个整数m%n都存在于1~n的集合中 。 构造加法链 在加密算法中,运用到了大量的取模运算,对于一个k位数模n,所有的运算例如加减乘除中间结构将不会超过2k位,因此例如a x mod n将会大大简化计算时的复杂度。 例如a 8 mod n 在计算时可以这样计算 ((a 2 mod n) 2 mod n) 2 mod n 当指数x不是2的倍数时则需要构造加法链,例如25,25 = 16 + 8 +1 = 2 4 + 2 3 + 2 0 因此a 25 mod n = (a * a 8 * a 16 ) mod n = ((((a 2 * a) 2 ) 2 ) 2 *a)mod n C语言表示 unsigned long ss(unsigned long x , unsigned long y , unsigned long n) { unsigned long s,t,u; int i ; s = 1;

一个关于国密SM4的故事

拈花ヽ惹草 提交于 2019-11-30 03:44:12
一个关于国密SM4的故事 https://www.cnblogs.com/ouyida3/p/10053862.htmlSM1 硬件SM2 非对称加密SM3 hash算法SM4 对称加密 一个关于国密SM4的故事 我的名字叫SM4,我还有三位兄长,分别是大哥SM1, 二哥SM2, 和三哥SM3。说起我的名字,故事要回到2006年的时候,我出生的时候并不是叫SM4的,而是叫做SMS4。只是2012年的时候我父亲给我改名了。虽然我起了一个洋气的名字,但我必须郑重地说,我是一个中国人。名字可能只是为了与国际接轨。 我的家族 先简单地介绍一下我的家族,我的父亲是国家密码管理局,我们几兄弟就主要负责起国家信息安全中的加密。我由一出生起,就不断地被家人提醒我要肩负重任。因此,我也非常努力,不断地学习和完善提升自我。 大哥主要负责硬件的加密,不知道是不是因为大哥身为长兄,所以份外地冷酷,他的加密算法和二哥三哥和我都不同,我们的算法都是公开的,但是大哥却埋藏得很深,我们都不知道他的算法是怎样的。 几兄弟里,我和二哥比较亲密,可能是因为他的业务名称和我比较像吧,他主要负责的是非对称加密。我有什么不懂都是经常跑去请教他的。 三哥主要负责哈希算法的。而我,则是负责对称加密。别看我现在说得头头是道,其实一开始我完全不理解这些名词到底是什么意思,于是我首先就走去问二哥。 我是干啥的 我说,二哥

密码学参考书

好久不见. 提交于 2019-11-29 16:24:29
密码学参考书 代数 A Computational Introduction to Number Theory and Algebra by Victor Shoup Algebra by Michael Artin 近世代数 by 欧阳毅 叶郁 密码学 A Graduate Course in Applied Cryptography by Dan Boneh and Victor Shoup Cryptography engineering: Design, Principles and Practical by Niels Ferguson Introduction to Modern Cryptography by Jonathan Katz and Yehuda Lindell Cryptography: An Introduction by Nigel Smart 计算复杂性理论 Introduction To The Theory Of Computation by Michael Sipser Computational Complexity: A Conceptual Perspective by Oded Goldreich 椭圆曲线 Elliptic Curves Number Theory And Cryptography by LAWRENCE C.

第六个知识点:我们怎么把NP问题解释成一组可以在多项式内证明的命题

柔情痞子 提交于 2019-11-29 13:41:34
第六个知识点:我们怎么把NP问题解释成一组可以在多项式内证明的命题 原文地址: http://bristolcrypto.blogspot.com/2014/11/52-things-number-6-how-can-we-interpret.html 这是密码学52件事的第六篇,我们继续解释复杂性理论,这篇我们给NP问题另一个定义。(注:就是说这节中,我们把"问题是否为NP的"转换为另一组可以在多项式时间内判定的定理)。 这个问题是紧接着上一周的问题的。上周我们回答了什么是复杂NP类问题。这周我们回答一个相关的问题---我们怎么把NP解释成一组能被多项式时间检查的命题。 现在我们看一个直觉上的"一个问题是NP的"这意味着什么?他不仅仅是一个直观的定义,更是清晰的说明了为什么这类复杂性问题对密码学和世界上其他问题那么重要。现在在我们讨论怎么用之前,我们先给出定义: NP 是一类能在多项式时间内确定的问题 NP 是存在多项式时间运行的Verifier 这到底啥意思?首先我们有一个元素 \(x\) ,我们想要知道是否 \(x \in L\) ( \(L\) 是NP语言)。我们有一个证明 \(P\) 对 \(x\) 输出一个证据 \(w\) ,这可能需要要给多项式时间在给定 \(x\) 寻找 \(w\) 。然后如果我们给出 \(x\) 和 \(w\) 到我们的验证器 \(V\) , \