取余与加密算法

2019-02-10  本文已影响0人  DJ_f3ee

      平时常用的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》

上一篇 下一篇

猜你喜欢

热点阅读