CANS_Exercise_4

RSA的实现

1.加密算法

其中public_key是一个元组,格式(e, n),相应的算法是遍历plainText,将其char值转化为ascii,并通过 c = m ** e mod n来进行加密,

def encrypt(public_key, plainText):
    e, n = public_key
    templist = []
    # 取字符的ascii码来进行加密 c = m ** e mod n
    for text in list(plainText):
        templist.append(chr(ord(text)**e % n))
    cipherText = ''.join(templist)
    return cipherText

2.解密算法

类似于加密算法,只是通过 m = ** d mod n 来解密

def decrypt(private_key, cipherText):
    d, n = private_key
    templist = [chr(ord(text)**d % n) for text in cipherText]
    return ''.join(templist)

3.求乘法逆元算法

利用了EGCD算法

def inverse(e, euler):
    d = 0
    x1 = 0
    x2 = 0
    y1 = 0
    temp = euler
    '''
    # 利用欧几里德算法求乘法逆元 (x1, x2, x3) = (1, 0, euler) (y1, y2, y3)=(0, 1, e)
    # 第一步:Q = x3 / y3
    # 第二步:t1, t2, t3 = x1 - Q * y1, x2 - Q * y2, x3 - Q * y3
    # 第三步: x1, x2, x3 = y1, y2, y3
    # 第四步:y1, y2, y3 = t1, t2, t3
    # 利用其算法直到 y3 == 1 为止,d = y2
    # 若 y3 == 0 不存在逆元
    '''
    while e > 0:
        temp1 = temp / e
        temp2 = temp - temp1 * e
        temp = e
        e = temp2
        x = x2 - temp1 * x1
        y = d - temp1 * y1
        x2 = x1
        x1 = x
        d = y1
        y1 = y
        if temp == 1:
            return d + euler

4.生成公钥密钥算法

生成的公钥密钥是存储在数组key里面的,其中key[0]是公钥,key[1]是密钥

import random

# 求最大公约数算法
def gcd(a, b):
    if a % b == 0:
        return b
    else:
        return gcd(b, a % b)


def gen(p, q):
    n = p * q
    euler = (p - 1) * (q - 1)

    # generate (e,n)
    e = random.randrange(1, euler)
    # 确保 e 是在Zn*域中
    while gcd(e, euler) != 1:
        e = random.randrange(1, euler)

    # 求解密密钥d
    d = inverse(e, euler)

    return [(e, n), (d, n)]

5.签名和验签的实现

这里的加密算法使用了RSA中的加密方式,使用了hashlib中的sha256来生成摘要h(m),然后再通过私钥加密。
验证里面即是通过相同的h(mes)的计算方法来和signed_text通过公钥解密后的h(m)对比是否相同来确定正确与否。
以下是相关实现代码

import hashlib

#使用了自己的私钥对m摘要的 h(m) 进行加密
def sign(text, private_key):
    h = hashlib.sha256()
    hashValue = h.update(text).hexdigest()
    return encrypt(private_key, hashValue)


def checkSign(signed_text, mes, public_key):
    h = hashlib.sha256()
    hashValue = h.update(mes).hexdigest()
    return (hashValue == decrypt(public_key, signed_text))

Diffie-Hellman秘钥交换协议

这是一个通过共享的素数p和生成元r来生成交换的公钥的函数

# a prime number: p
# a primitive root of p: r
def diffieHellman(p, r, private_key):
    """
    :type p: int
    :type r: int
    :type private_key: int
    :rtype: int
    """
    return r ** private_key % p

之后就将自身计算得出的公钥发给对方


当得到对方的公钥后,再通过自身的私钥来计算sercet_key
公式是sercet_key = public_key ** private_key % p

def genShareKey(p, private_key, public_key):
    """
    :type p: int
    :type private_key: int
    :type public_key: int
    :rtype: int
    """
    return public_key ** private_key % p
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,108评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,699评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,812评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,236评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,583评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,739评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,957评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,704评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,447评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,643评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,133评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,486评论 3 256
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,151评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,889评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,782评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,681评论 2 272

推荐阅读更多精彩内容

  • 本文主要介绍移动端的加解密算法的分类、其优缺点特性及应用,帮助读者由浅入深地了解和选择加解密算法。文中会包含算法的...
    苹果粉阅读 11,305评论 5 29
  • 文中首先解释了加密解密的一些基础知识和概念,然后通过一个加密通信过程的例子说明了加密算法的作用,以及数字证书的出现...
    纳兰三少阅读 1,808评论 1 6
  • 前言 文中首先解释加密解密的一些基础知识和概念,然后通过一个加密通信过程的例子说明了加密算法的作用,以及数字证书的...
    sunny冲哥阅读 2,874评论 0 2
  • 生活总让人学着去成长,在一些无形的话语中慢慢都会改变。有句话是,说者无心,听者有意,正是因为这样,每个人在每个阶段...
    xr小蕊阅读 95评论 0 1
  • 看了几篇《沟通圣经》的笔记,大家都说好,我也来读一读。但老实说,书刚拿到手时,面对那么厚一本确实还是有点懵的。我不...
    RichRuby阅读 256评论 0 2