异或密码
简单异或密码(英語:simple XOR cipher)是密码学中一种简单的加密算法,它按照如下原则进行运算:
其中为逻辑异或(XOR)运算的符号。按这种逻辑,文本序列的每个字符可以通过与给定的密钥进行按位异或运算来加密。如果要解密,只需要将加密後的结果与密钥再次进行按位异或运算即可。 例如,字符串“Wiki”(8位ASCII:01010111 01101001 01101011 01101001) 可以按如下的方式用密钥11110011进行加密:
此種加密方法類似對稱加密,故解密的方式如下:
异或运算符常作为更为复杂的加密算法的组成部分。对於其本身来说,如果使用不断重复的密钥,利用频率分析就可以破解这种简单的异或密码。如果消息的内容被猜出或知道,密钥就会泄露。异或密码值得使用的原因主要是其易於实现,而且计算成本小。简单重复异或加密有时用於不需要特别安全的情况下来隐藏信息。 如果密钥是随机的(不重复),而且与消息长度相同,异或密码就会更为安全。当密钥流由伪随机数发生器生成时,结果就是流密码。若密钥是真正随机的,结果就是一次性密碼本,這種密码在理论上是不可破解的。 在这些密码的任何部分中,密钥运算符在已知明文攻击下都是脆弱的,这是因为明文 密文 = 密钥。 程式碼範例C語言加密: while (done < len) {
tmp_ch = *buffer;
for(int i = 0; i < key_len; i++)
tmp_ch ^= key[i];
*crypted = tmp_ch;
crypted++; buffer++; done++;
}
解密: while (done <= len) {
tmp_ch = *buffer;
for(int i = key_len-1; i >= 0; i--)
tmp_ch ^= key[i];
*decrypted = tmp_ch;
decrypted++; buffer++; done++;
}
golangfunc XOR(input []byte, key []byte) []byte { //解密時僅需將原本的output改到input,key不變即可
output := make([]byte, len(input))
for i := range input {
output[i] = input[i] ^ key[i%len(key)] //當input比key長時會不斷使用key對每一個byte加密
}
return output
}
Python#!/usr/bin/env python
from __future__ import print_function
from os import urandom
def o(x): # Python 2 and 3 compatibility with bytes
if isinstance(x, str):
return ord(x)
else:
return x
def genkey(length):
"""Generate key"""
return urandom(length)
def xor_strings(s,t):
"""xor two strings together"""
return "".join(chr(o(a)^o(b)) for a,b in zip(s,t))
message = 'This is a secret message'
print('message:', message)
key = genkey(len(message))
print('key:', key)
cipherText = xor_strings(message, key)
print('cipherText:', cipherText)
print('decrypted:', xor_strings(cipherText,key))
# verify
if xor_strings(cipherText, key) == message:
print('Unit test passed')
else:
print('Unit test failed')
参见外部链接 |
Index:
pl ar de en es fr it arz nl ja pt ceb sv uk vi war zh ru af ast az bg zh-min-nan bn be ca cs cy da et el eo eu fa gl ko hi hr id he ka la lv lt hu mk ms min no nn ce uz kk ro simple sk sl sr sh fi ta tt th tg azb tr ur zh-yue hy my ace als am an hyw ban bjn map-bms ba be-tarask bcl bpy bar bs br cv nv eml hif fo fy ga gd gu hak ha hsb io ig ilo ia ie os is jv kn ht ku ckb ky mrj lb lij li lmo mai mg ml zh-classical mr xmf mzn cdo mn nap new ne frr oc mhr or as pa pnb ps pms nds crh qu sa sah sco sq scn si sd szl su sw tl shn te bug vec vo wa wuu yi yo diq bat-smg zu lad kbd ang smn ab roa-rup frp arc gn av ay bh bi bo bxr cbk-zam co za dag ary se pdc dv dsb myv ext fur gv gag inh ki glk gan guw xal haw rw kbp pam csb kw km kv koi kg gom ks gcr lo lbe ltg lez nia ln jbo lg mt mi tw mwl mdf mnw nqo fj nah na nds-nl nrm nov om pi pag pap pfl pcd krc kaa ksh rm rue sm sat sc trv stq nso sn cu so srn kab roa-tara tet tpi to chr tum tk tyv udm ug vep fiu-vro vls wo xh zea ty ak bm ch ny ee ff got iu ik kl mad cr pih ami pwn pnt dz rmy rn sg st tn ss ti din chy ts kcg ve
Portal di Ensiklopedia Dunia