鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: jerryxjr1220

[技术交流] python小练习(002):简单字符串加密解密(基础篇)

[复制链接]
发表于 2017-1-24 22:30:04 | 显示全部楼层
choice = int(input('请输入需要执行的操作:\n1.加密\n2.解密'))


def encode(laws_str, key):
    output = []
    for i, code in enumerate(laws_str):
        output.append((ord(code) ^ ord(key[i % 3])))
    return output


def decode(ciphertext, keys):
    output = ''
    # enumerate 函数前一个参数为了显示下标
    for i, code in enumerate(ciphertext):
        output += (chr(int(code) ^ ord(keys[i % 3])))
    return output


if choice == 1:
    laws_str = str(input('请输入需要加密的明文:'))
    key = str(input('请输入秘钥:'))
    print(encode(laws_str, key))
else:
    ciphertext_str_None = input('请输入需要解密的密文:').split(',')
    key = str(input('请输入秘钥:'))
    print(decode(ciphertext_str_None, key))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-25 15:27:03 | 显示全部楼层

# -*coding:utf-8*-
               
def main():
    while True:
        strs = True
        num = input('请输入明文: ')
        pas = input('请输入秘钥')
        if ',' in num:
            num = num.split(',')
            strs = False
        
        a = 0
        for each in num:
            if strs:
               
                print(str(ord(each)^ord(pas[a]))+',',end='')
            else:
                print(chr(int(each)^int(ord(pas[a]))),end='')
               
            if a == (len(pas)-1):
                              a=0
            else:
                a+=1
        print()   
if __name__ == '__main__':
    main()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-7 18:00:52 | 显示全部楼层
这些问题对于新手不简单啊!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-2-17 14:20:53 | 显示全部楼层
  1. def jiam():
  2.     neirong=input('请输入需要翻译的内容:')
  3.     miyao=input('输入密钥:')
  4.     nrasc=[]
  5.     myasc=[]
  6.     for i in neirong:
  7.         nrasc.append(ord(i))
  8.     for i in miyao:
  9.         myasc.append(ord(i))
  10.     lmy=len(myasc)
  11.     lnr=len(nrasc)
  12.     mwasc=[]
  13.     for i in range(lnr):
  14.         mwasc.append(nrasc[i]^myasc[i%lmy])
  15.     print('密文为:',end='')
  16.     for i in mwasc:
  17.         print(i,end=',')
  18.     print()

  19. def jiem():
  20.     nrasc=input('请输入需要解密的内容:')
  21.     miyao=input('输入密钥:')
  22.     neirong=[]
  23.     myasc=[]
  24.     neirong=nrasc.split(',')
  25.     for i in miyao:
  26.         myasc.append(ord(i))
  27.     lmy=len(myasc)
  28.     lnr=len(neirong)
  29.     mwasc=[]
  30.     for i in range(lnr):
  31.         mwasc.append(chr(int(neirong[i])^myasc[i%lmy]))
  32.     print('明文为:',end='')
  33.     for i in mwasc:
  34.         print(i,end='')
  35.     print()
  36.    
  37. while True:
  38.     x=input('需要加密请输入1,需要解密输入2。输入其他字符退出:')
  39.     if x=='1':
  40.         jiam()
  41.     elif x=='2':
  42.         jiem()
  43.     else:
  44.         break
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-24 13:34:14 | 显示全部楼层
不看版主的说明真不知道密钥是啥意思,原本还打算用ASCII码加起来作定值,感觉还是随机范围广不易重复,学习了

  1. import random


  2. def encode(ob_string, key):
  3.     """通过明文密码+秘钥方式编译出密文,密文以英文逗号隔开"""
  4.     random.seed(key)
  5.     num = random.randint(1,300)
  6.     hide_string = ''
  7.     for i in ob_string:
  8.         hide_string += str(ord(i)^num) + ','

  9.     return hide_string.rstrip(',')

  10. def decode(hide_string, key):
  11.     """通过密文密码+秘钥方式解密出明文,密文输入要带上英文逗号"""
  12.     random.seed(key)
  13.     num = random.randint(1,300)

  14.     ob_string = ''
  15.     i = hide_string.find(',')
  16.     while i != -1:
  17.         ob_string += chr(int(hide_string[:i])^num)
  18.         hide_string = hide_string[i+1:]
  19.         i = hide_string.find(',')
  20.         
  21.     ob_string += chr(int(hide_string)^num)
  22.             
  23.     return ob_string

  24. def start():
  25.     choice = input("请选择操作:\n1、加密\n2、解密\n")
  26.     if choice == '1':
  27.         string = input("请输入明文:")
  28.         key = input("请输入秘钥:")
  29.         print(encode(string, key))
  30.         
  31.     elif choice == '2':
  32.         string = input("请输入密文:")
  33.         key = input("请输入秘钥:")
  34.         print(decode(string, key))
  35.          
  36.     else:
  37.         print("操作异常,请输入数字“1”或“2”")
  38.         start()

  39. start()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-28 23:20:16 | 显示全部楼层
交作业(花了好久在理解异或的运算上ORZ):
  1. #密文生成
  2. def encode(clear_text,key_text):
  3.     txt = [ord(i) for i in clear_text]
  4.     key = [ord(i) for i in key_text]
  5.     output = []
  6.     for i in range(len(txt)):
  7.         s = i%len(key)
  8.         output.append(txt[i]^key[s])
  9.     output=','.join(map(str,output))
  10.     return output

  11. #明文转换
  12. def decode(cipher_text,key_text):
  13.     cipher = [i for i in (cipher_text.split(','))]
  14.     key = [ord(i) for i in key_text]
  15.     output = []
  16.     for i in range(len(cipher)):
  17.         s = i%len(key)
  18.         output.append(chr(int(cipher[i])^key[s]))
  19.     output=''.join(output)
  20.     return output



  21. while 1:
  22.     order = input('请选择加密(1)或者解密(2):')
  23.     if order=='1':
  24.         clear_text = input('请输入要加密的文字:')
  25.         key_text = input('请输入要加密的密钥:')
  26.         print('密文为:'+encode(clear_text,key_text))

  27.     elif order=='2':
  28.         cipher_text = input('请输入要解密的文字(以‘,’分隔):')
  29.         key_text = input('请输入要加密的密钥:')
  30.         try:
  31.             print('明文为:'+decode(cipher_text,key_text))
  32.         except:
  33.             print('输入有误')
  34.         
  35.     else:
  36.         print('输入有误')

复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-29 16:00:41 | 显示全部楼层
def 加密(明文, 密钥):

    # 把明文和密钥分别转换成ASCII值的列表
    a = list(map(lambda x: ord(x), 明文))
    b = list(map(lambda x: ord(x), 密钥))
    # 取异或后返回密文
    密文 = []
    密钥长度 = len(b)
    for char in a:
        密文.append(char ^ b[a.index(char) % 密钥长度])
    return 密文

print(加密('Father','god'))

def 解密(密文, 密钥):
    # 密文为一个数字组成的列表
    # 把密钥分别转换成ASCII值的列表
    b = list(map(lambda x: ord(x), 密钥))
    密钥长度 = len(b)
    # 取异或后返回明文
    明文 = []
    for i in range(len(密文)):
        明文.append( chr(int(密文[i]) ^ b[i % 密钥长度]))
    return ''.join(明文)

密文 = input('请输入密文,以“,”隔开:\n')
lst = 密文.split(',')
print(解密(lst, 'god'))


python3支持中文做变量名了,所以俺就这么写了。
英文不好,不好意思。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-29 16:03:32 | 显示全部楼层
  1. def 加密(明文, 密钥):

  2.     # 把明文和密钥分别转换成ASCII值的列表
  3.     a = list(map(lambda x: ord(x), 明文))
  4.     b = list(map(lambda x: ord(x), 密钥))
  5.     # 取异或后返回密文
  6.     密文 = []
  7.     密钥长度 = len(b)
  8.     for i in range(len(a)):
  9.         密文.append(a[i] ^ b[i % 密钥长度])
  10.     return 密文

  11. print(加密('Father','god'))

  12. def 解密(密文, 密钥):
  13.     # 密文为一个数字组成的列表
  14.     # 把密钥分别转换成ASCII值的列表
  15.     b = list(map(lambda x: ord(x), 密钥))
  16.     密钥长度 = len(b)
  17.     # 取异或后返回明文
  18.     明文 = []
  19.     for i in range(len(密文)):
  20.         明文.append( chr(int(密文[i]) ^ b[i % 密钥长度]))
  21.     return ''.join(明文)

  22. 密文 = input('请输入密文,以“,”隔开:\n')
  23. lst = 密文.split(',')
  24. print(解密(lst, 'god'))
复制代码


修改了一下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-29 16:11:12 | 显示全部楼层
  1. def 加密(明文, 密钥):

  2.     # 把明文和密钥分别转换成ASCII值的列表
  3.     a = list(map(lambda x: ord(x), 明文))
  4.     b = list(map(lambda x: ord(x), 密钥))
  5.     # 取异或后返回密文
  6.     密文 = []
  7.     密钥长度 = len(b)
  8.     for i in range(len(a)):
  9.         密文.append(a[i] ^ b[i % 密钥长度])
  10.     return 密文

  11. 明文 = input('请输入明文: \n')
  12. 密钥 = input('请输入密钥: \n')
  13. print('加密后: ',加密(明文,  密钥))

  14. def 解密(密文, 密钥):
  15.     # 密文转换为一个数字组成的列表
  16.     密文 = list(map(lambda x: int(x), 密文))
  17.     # 把密钥分别转换成ASCII值的列表
  18.     b = list(map(lambda x: ord(x), 密钥))
  19.     密钥长度 = len(b)
  20.     # 取异或后返回明文
  21.     明文 = []
  22.     for i in range(len(密文)):
  23.         明文.append( chr(int(密文[i]) ^ b[i % 密钥长度]))
  24.     return ''.join(明文)

  25. 密文 = input('请输入密文,以“,”隔开:\n')
  26. lst = 密文.split(',')
  27. 密钥 = input('请输入密钥: \n')
  28. print('解密后: ', 解密(lst, 密钥))
复制代码


输出结果:
请输入明文:
Father
请输入密钥:
god
加密后:  [33, 14, 16, 15, 10, 22]
请输入密文,以“,”隔开:
33,14,16,15,10,22
请输入密钥:
god
解密后:  Father
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-29 17:00:30 | 显示全部楼层
本帖最后由 elbert 于 2017-3-29 17:07 编辑
  1. def enco(s,g1):
  2.         m = len(s)
  3.         n = len(g1)
  4.         k=m//n
  5.         print(k)
  6.         mw = []
  7.         for j in range(k):
  8.                 for i in range(n):
  9.                         mw.append(str(ord(s[i+n*j]) ^ ord(g1[i])))
  10.         print(",".join(mw))


  11. def deco(s1,g1):
  12.         n1 = len(g1)
  13.         s1 = s1.split(',')
  14.         m1 = len(s1)
  15.         k1 = m1//n1
  16.         print("密文长度为:%s  \nk1的数值为:%s" % (m1 , k1))
  17.         mw1 = []
  18.         for j in range(k1):
  19.                 for i in range(n1):
  20.                         mw1.append(chr(int(s1[i+n1*j]) ^ ord(g1[i])))
  21.         print("".join(mw1))
  22.        
  23.        
  24. s = input("输入明文:")
  25. g1 = input("请输入密钥:")
  26. enco(s,g1)

  27. s1 = input("请输入密文(以','分开):")
  28. g1 = input("请输入密钥:")
  29. deco(s1,g1)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-28 20:59:20 | 显示全部楼层
  1. #获得加密字符串和密匙
  2. def get_key():
  3.         string=input("输入明文:")
  4.         key=input("输入密钥匙:")
  5.         return string,key
  6. #加密操作
  7. def encode_str(string,key):
  8.         l_key=len(key)
  9.         l_string=len(string)
  10.         mima=''
  11.         for i in range(l_string):
  12.                 num=ord(key[i%l_key])^ord(string[i])
  13.                 mima=mima+str(num)
  14.                 if i<l_string-1:
  15.                         mima=mima+','
  16.         print("密文为:",mima)
  17.         return mima
  18. #解密操作
  19. def decode_str():
  20.         mima=input("请输入密码(用“,”分隔):")
  21.         key=input("输入密钥匙:")
  22.         mima=mima.strip().split(',')
  23.         mima=[int(i) for i in mima]
  24.         l_key=len(key)
  25.         l_mima=len(mima)
  26.         string=''
  27.         for i in range(l_mima):
  28.                 string=string+chr(ord(key[i%l_key])^mima[i])
  29.         print("明文为:",string)
  30. if __name__ == '__main__':
  31.         string,key=get_key()
  32.         encode_str(string,key)
  33.         decode_str()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-5 20:51:30 | 显示全部楼层
def jiami(clear_word,password):
    list_cw = []
    list_pw = []
    for i in clear_word:
        list_cw.append(ord(i))
    for i in password:
        list_pw.append(ord(i))

    len_cw = len(clear_word)
    len_pw = len(password)

    vacant_list = []
    for i in range(len_cw):
        vacant_list.append(list_cw[i]^list_pw[i%len_pw])
    return vacant_list


def jiemi(dirt_word,password):
    list2_pw = []
    for i in password:
        list2_pw.append(ord(i))
    len_dw = len(dirt_word)
    len_pw = len(password)
    vacant_list = []
    for i in range(len_dw):
        vacant_list.append(chr(int(dirt_word[i])^list2_pw[i%len_pw]))
    return vacant_list


def output_miwen(miwen):
    count = 0
    for i in miwen:
        if count<len(miwen)-1:
            print(i,end = ',')
        else:
            print(i)
        count+=1

def output_mingwen(mingwen):
    for i in mingwen:
        print(i,end = '')

def exchangelist(i):
    vacant = []
    for j in range(i):
        while True:
            num = input('请输入:')
            if 0<=int(num)<=255:
                vacant.append(num)
                break
            print('输入有误,请重新输入')
    return vacant

print('你想加密还是解密?')
while True:
    answer = input('我想:(加密/解密)')
    if answer =='加密':
        clear = input('请输入明文:')
        word = input('请输入密匙:')
        miwen = jiami(clear,word)
        output_miwen(miwen)
        break
    elif answer == '解密':
        num = int(input('你想输入多少位的密文?'))
        dirt = exchangelist(num)
        word = input('请输入密匙:')
        mingwen = jiemi(dirt,word)
        output_mingwen(mingwen)
        break
    else:
        print('输入错误,请输入‘加密’或者‘解密’')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-7 23:59:16 | 显示全部楼层
  1. def encry(words, keyword='god'):
  2.     encrynumlist = []
  3.     for i in range(len(words)):
  4.         j = i % len(keyword)
  5.         encrynumlist.append(ord(words[i]) ^ ord(keyword[j]))
  6.     return encrynumlist


  7. def decode(strings, keyword):
  8.     decode_words = ''
  9.     numlist = strings.split(',')
  10.     numlist.pop()
  11.     numlist1 = [int(num) for num in numlist]
  12.     for i in range(len(numlist)):
  13.         j = i % len(keyword)
  14.         decode_words += chr(numlist1[i] ^ ord(keyword[j]))
  15.     return decode_words
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-8 11:50:11 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-11-7 17:56:55 | 显示全部楼层
# -*- coding: utf-8 -*-

import base64 as b64

#编码
def encrypt(data,key):
       
        length_data=len(data)
        length_key=len(key)
        secret=[]
        for i in range(length_data):
                j=i%length_key
                secret.append(ord(chr (ord(data[i]) ^ ord(key[j]) )))
        return secret

#解码
def decrypt(secret,key):
       
        length_secret=len(secret)
        length_key=len(key)
        data=[]
        for i in range(length_secret):
                j=i%length_key
                data.append(str(chr ( secret[i] ^ ord(key[j])) ))
        return ''.join(data)
       
data=input("输出要加密的数据:")
key=input("输入密码:")
s=encrypt(data,key)       
d=decrypt(s,key)
print(s)       
print(d)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-31 23:50:48 | 显示全部楼层
用楼主的方法写了下python3的代码
  1. choice = input("加密扣1,解密扣2:")

  2. #加密
  3. def encode(string, key):
  4.     str1 = ''
  5.     keys = key*(len(string)//len(key)) + key[:len(string)%len(key)]
  6.     for i in range(len(string)):
  7.         str1 += str(ord(string[i])^ord(keys[i])) + ','
  8.     return str1.strip(',')

  9. #解密
  10. def decode(string, key):
  11.     str2 = ''
  12.     str3 = string.split(',')
  13.     keys = key*(len(str3)//len(key)) + key[:len(str3)%len(key)]
  14.     for i in range(len(keys)):
  15.         str2 += str(chr(int(str3[i])^ord(keys[i])))
  16.     return str2
  17.         
  18. while True:
  19.     if choice == '1' or choice == '2':
  20.         break
  21.     choice = input("加密扣1,解密扣2:")

  22. if choice == '1':
  23.     string = input("请输入需要加密的明文:")
  24.     key = input("请输入秘钥:")
  25.     print('密文为:%s' % encode(string, key))
  26. else:
  27.     string = input("请输入密文按英文逗号隔开:")
  28.     key = input("请输入秘钥:")
  29.     print('明文为:%s' % decode(string, key))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 22:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表