美文网首页
取余与加密算法

取余与加密算法

作者: DJ_f3ee | 来源:发表于2019-02-10 10:33 被阅读0次

      平时常用的ssh密钥推送,到网上仓库,一听原理吓死人,后来想了想,其实也没有难么难。       

      在第二次世界大战中,日本军方的密码设计很成问题。美军破获了日本很多密码。在中途岛海战前,美军截获的日军密电经常出现AF这样一个地名,应该是太平洋的某个岛屿,但是美军无从知道是哪个。当美军发出‘中途岛供水系统坏了’这条假新闻后,从截获的日军情报中又看到AF供水出来问题的电文,美军就断定中途岛就是AF。于是,美军在那里成功地伏击了日本主力舰队 。

从第二次世界大战源生的信息论,给密码学带来了新气象。一般来讲,当密码分布均匀并且统计独立时,提供的信息最少。均匀分布使得敌人无从统计,而统计独立能保证敌人即使看到一段密码和明码后,不能破译另一段密码。                                                                                                                            ssh使用其实过程简单,公钥 私钥都是一定的算法生成的,下面简单介绍这个原始版本

shh登录

1.找一个很大的素数(质数)P和Q,越大越好,比如100位长的,然后计算它们的乘积 N=P * Q,  M=(P -1)*(Q - 1)。                                                                                                                      2.找一个和M互素的整数E,也就是说M和E除了 1 以外没有公约数。                                                  3.找一个整数 D ,使得 E * D除以 M 余1,即 E * D mod M = 1        mod是取余                                                                                                                                                                                           E:公钥          D:私钥 ,用于解密        乘机N是公开的,即使敌人知道了也没有关系                        ok,对单词Caesar 加解密来看看。

其Ascii代码 X = 099097101115097114做明码。对X加密,得到密码Y。  没有密钥D,神仙也无法从Y中恢复X。如果知道D,根据费马小定理,则可根据公式就可以轻而易举地从Y中得到X。                      破解这种密码的难度:对大数N进行因数分解,找到 P Q。所以你可以通过计算机把所有的数字试一遍。                                                                                                                                                        平时用取余,也没有那么高级,比如哈希表,实际上就是取余分配                                              python 实现简单散列函数or简单哈希表   

比如除以100得余数

def new(num_buckets=256):            """Initializes  a  Map with    the given  number  of  buckets."""         

    aMap    =  []             

    for i  in  range(0,num_buckets):                        aMap.append([]) return  aMap

def hash_key(aMap,  key):             

    """Given    a  key this    will    create  a  number  and then    convert it  to  an  index  for the aMap's  buckets."""           

    hash_key = ''

    for i in key:

        hash_key += ord(key[i])

    return  hash_key % len(aMap)

def get_bucket(aMap,    key):             

    """Given    a  key,    find    the bucket  where  it  would  go."""             

    bucket_id  =  hash_key(aMap,  key)      return  aMap[bucket_id]

def get_slot(aMap,  key,    default=None):             

    """

    Returns the index,  key,    and value  of  a  slot    found  in  a  bucket.           

    Returns -1, key,    and default (None  if  not set)    when    not found.             

    """           

    bucket  =  get_bucket(aMap,key)

    for i,  kv  in  enumerate(bucket):                             

        k,  v  =  kv                             

        if  key ==  k:                                                    return  i,  k,  v

    return  -1, key,    default

def get(aMap,  key,    default=None):             

    """Gets the value  in  a  bucket  for the given  key,    or  the default."""           

    i,  k,  v  =  get_slot(aMap,  key,    default=default)               

    return  v

def set(aMap,  key,    value):           

    """Sets the key to  the value,  replacing  any existing    value."""                bucket  =  get_bucket(aMap,    key)        i,  k,  v  =  get_slot(aMap,  key)

    if  i >= 0:

    # the  key exists, replace it

        bucket[i] = (key,  value)             

    else:                             

    #  the key does    not,    append  to  create  it                             

        bucket.append((key, value))

def delete(aMap,    key):             

    """Deletes  the given  key from    the Map."""           

    bucket = get_bucket(aMap,  key)

    for i  in  range(len(bucket)):                           

        k,  v  =  bucket[i]                             

        if  key ==  k:                                             

            del bucket[i]                                             

            break

def list(aMap):           

    """Prints  out what's  in  the Map."""           

    for bucket  in  aMap:                             

        if  bucket:                                           

            for k,  v  in  bucket:                                                           

                print(k , v)

reference:吴军 《数学之美》                                                                                                                      《数据结构与算法javascript 描述》                                                                                            《程序员的基础数学课》    极客时间                                                                                        《learn-python-the-hard-way》

相关文章

  • 取余与加密算法

    平时常用的ssh密钥推送,到网上仓库,一听原理吓死人,后来想了想,其实也没有难么难。 在第二...

  • 取模与取余运算

    取余运算是让商的绝对值尽可能的小,也就是向0取值。 取模运算是让商尽可能的小,向负无穷取值。 区别:都是取余数,所...

  • JavaScript的数学运算

    一,数学运算 与数学运算相似,加减乘除,重点是取余(求余/取模)% var a =2; a +=3;------...

  • 取余

    要想让一个数不大于大少,就要那个不大于的数取余比如:要一个数不大于60 这个技巧在倒计时获取时间方面最常用比如:我...

  • 取余、自加、逻辑运算符

    算术运算符 取余 取余运算的符号与被模数的符号相同 前++ 与 后++ 区别 自加1 不会改变本身变量的数据类型 ...

  • 取整 取余

    NSArray *contAry = @[@"", @"", @"", @"", ...

  • 取余 取整

  • java 中的除法与取余

    一、取余?取模? 首先区别一下取模运算(Modulo Operation)和取余运算(Complementatio...

  • Swift 关于取余或取模的方法truncatingRemain

    Swift5关于取余或取模的方法truncatingRemainderSwift5 不支持 % 来取模(取余)使用...

  • 取模与求余问题

    大多数取模运算(mod)和求余(rem)运算都被混为一谈,因为在大多数的编程语言里,都用'%'符号表示...

网友评论

      本文标题:取余与加密算法

      本文链接:https://www.haomeiwen.com/subject/uruteqtx.html