首页
留言
友链
关于
Search
1
欢迎使用 Typecho
49 阅读
2
关于RSA有话说
42 阅读
3
一些题目中了解到的Crypto
31 阅读
4
Absolute music
26 阅读
默认分类
学习
日常
文字
登录
Search
Typecho
累计撰写
4
篇文章
累计收到
7
条评论
首页
栏目
默认分类
学习
日常
文字
页面
留言
友链
关于
搜索到
2
篇与
的结果
2022-07-31
一些题目中了解到的Crypto
今天终于拾起这颗摆烂的心,静静地看了几道关于Crypto的题,发现自己对于这个方向的了解甚浅!但没关系,我不会轻言放弃。首先总结如下:在此声明,题目中所出现的题所涉及的类型我都会记录如下,持续更新... 摩斯密码 对照摩斯电码表 URL编码 URL 编码将字符转换为可通过因特网传输的格式。URL 只能使用 ASCII 字符集 通过因特网进行发送。由于 URL 通常包含 ASCII 集之外的字符,因此必须将 URL 转换为有效的 ASCII 格式。URL 编码使用后跟十六进制数字的 "%" 替代不安全的 ASCII 字符。URL 不能包含空格。URL 编码通常使用加号(+)或 %20 替代空格。注:参考ASCII 编码参考手册栅栏密码 所谓栅栏密码,就是把要加密的明文分成N个一组,然后把每组的第1个字连起来,形成一段无规律的话。 不过栅栏密码本身有一个潜规则,就是组成栅栏的字母一般不会太多。(一般不超过30个,也就是一、两句话)加密原理①把将要传递的信息中的字母交替排成上下两行。②再将下面一行字母排在上面一行的后边,从而形成一段密码。③例如:明文:THE LONGEST DAY MUST HAVE AN END加密:1、把将要传递的信息中的字母交替排成上下两行。T E O G S D Y U T A E N NH L N E T A M S H V A E D2、 密文:将下面一行字母排在上面一行的后边。TEOGSDYUTAENN HLNETAMSHVAED解密:先将密文分为两行T E O G S D Y U T A E N NH L N E T A M S H V A E D再按上下上下的顺序组合成一句话明文:THE LONGEST DAY MUST HAVE AN END实现的部分源代码://加密部分: // 获取密钥和明文 String str_p = et_plaintext.getText().toString(); char[] str_p_char = null; { try { str_p_char = str_p.toCharArray(); } catch (Exception e) { System.out.println("Exception"); } int len=str_p_char.length; System.out.println("len:"+len); StringBuffer sb_1 = new StringBuffer(); StringBuffer sb_2 = new StringBuffer(); if(len%2==1) { for (int i = 0; i <len;i=i+1) { if(i%2==0) { sb_1.append(str_p_char[i]); } else { sb_2.append(str_p_char[i]); } } } else { for (int i = 0; i <len; i=i+2) { sb_1.append(str_p_char[i]); sb_2.append(str_p_char[i+1]); } } str_p = sb_1.toString()+sb_2.toString(); //解密部分: String str_c = et_ciphertext.getText().toString(); char []str_c_char = null; try { str_c_char=str_c.toCharArray(); } catch(Exception e) { System.out.println("Exception"); } int len=str_c_char.length; int half=len/2; StringBuffer sb = new StringBuffer(); if(len%2==1) { int i=0; for (i = 0; i <half;i=i+1) { sb.append(str_c_char[i]); sb.append(str_c_char[i+half+1]); } sb.append(str_c_char[half]); } else { for (int i = 0; i <half; i=i+1) { sb.append(str_c_char[i]); sb.append(str_c_char[i+half]); } } str_c=sb.toString();OOK密码 ook密码中有大量ook,加上一些符号;Ook! has only three distinct syntax elements:Ook.Ook?Ook!这种就是ook密码Brainfuck Brainfuck是一种极小化的计算机语言注:两种均用替换法在线加密解密: https://www.splitbrain.org/services/ook BASE大家族base64,base32,base16.是最为常用的。关于三种base区分:1.Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,base64就是一种基于64个可打印字符来表示二进制数据的表示方法。由于2的6次方等于64,所以每6个比特为一个单元,对应某个可打印字符。三个字节有24个比特,对应4个base64单元,即3个字节可表示4个可打印字符。它可用来作为电子邮件的传输编码。在base64中的可打印字符包括字母A-Z、a-z、数字0-9,这样共有62个字符,此外两个可打印符号在不同系统中而不同。2.关于base32:base32中只有大写字母(A-Z)和数字234567。3.关于base16:base16中只有数字0-9以及大写字母ABCDEF。猪圈密码 猪圈密码是一种以格子为基础的简单替代式密码。即使使用符号,也不会影响密码分析,亦可用在其它替代式的方法。实现:1.单个 2.整体 Polybius密码一般是将给定的明文加密为两两组合的数字。密码表: 1.对于解密,对密文每两个字符一组,分别进行解密;2.由于密文仅包含5个字符,所以其密钥(也就是密码表)只有5!种可能;3.写脚本暴力攻击(brute-force)即可。5bit编码 五个比特的编码可以表示32种不同的状态。 5个比特就是5位2进制数,5位2进制数可以表示为00000、00001、00010、00011、00100、00101、00110、00111......11111,换算成十进制就是0、1、2、3、4、5、6、7......32共计32种状态。5bit编码在线解密: https://www.boxentriq.com/code-breaking/baudot-code
2022年07月31日
31 阅读
3 评论
1 点赞
2022-07-29
关于RSA有话说
最近学习了一些关于Crypto的知识,我把重点放到了RSA上面,它有很多题型,就是因为RSA他是一个很好,很标准的模板,它上面不只是展示一些RSA基础的东西,它还可以把一些离散对数,椭圆曲线,格子上的一些东西放到RSA模板上...说实话这些对于我来说有亿点点难!首先,深入了解了一下数学原理,比如欧拉函数,欧拉定理模逆及指数,其中,欧拉定理十分重要。 除此之外还需要两个常见的Python包下的函数。#Crypto.Util.number bytes_to_long() & long_to_bytes() getPrime() & getStrongPrime() inverse() & pow() #gmpy2 iroot() gcdext() next_prime()RSA的算法 解密过程: 加密过程: 使用代码描述:from Crypto.Util.number import * #generate public key and private key p,q = getPrime(512),getPrime(512) n = p*q phi = (p-1)*(q-1) e = getPrime(20) while GCD(e,phi) != 1; e = getPrime(20) d = inverse(e,phi) #encrypt flag = b'flag{te3t_f1@g}' m = bytes_to_long(flag) c = pow(em,e,n) #decrypt M = pow(c,d,n) FLAG = long_to_bytes(M) print(FLAG)
2022年07月29日
42 阅读
1 评论
1 点赞