取余与加密算法
平时常用的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》