3.22打卡



  • Playfair密码

    加密

    编制密码表
    第一步是编制密码表。在这个5*5的密码表中,共有5行5列字母。第一列(或第一行)是密钥,其余按照字母顺序。密钥是一个单词或词组,若有重复字母,可将后面重复的字母去掉。当然也要把使用频率最少的字母去掉。如:密钥是Live and learn,去掉后则为liveandr。如果密钥过长可占用第二列或行。
    同时字母I和J会被当成一个字母。
    如密钥crazy dog,可编制成
    924ab751-b5ee-46cb-9900-32654abc5baf-image.png
    整理明文
    第二步整理明文。将明文每两个字母组成一对。如果成对后有两个相同字母紧挨或最后一个字母是单个的,就插入一个字母X(或者Q)。
    如,communist,应成为co,mx,mu,ni,st。

    编写密文
    最后编写密文。对明文加密规则如下:
    1 若p1 p2在同一行,对应密文c1 c2分别是紧靠p1 p2 右端的字母。其中第一列被看做是最后一列的右方。如,按照前表,ct对应dc
    2 若p1 p2在同一列,对应密文c1 c2分别是紧靠p1 p2 下方的字母。其中第一行被看做是最后一行的下方。
    3 若p1 p2不在同一行,不在同一列,则c1 c2是由p1 p2确定的矩形的其他两角的字母(至于横向替换还是纵向替换要事先约好,或自行尝试)。如,按照前表,wh对应ku或uk。
    如,依照上表,明文where there is life,there is hope.
    可先整理为:WH ER ET HE RE IS LI FE TH ER EI SH OP EX
    然后密文为:KU YO XD OL OY PL FK DL FU YO LG LN NG LY
    将密文变成大写,然后几个字母一组排列。
    如5个一组就是KUYOX DOLOY PLFKD LFUYO LGLNN GLY

    解密

    Playfair解密算法首先将密钥填写在一个5*5的矩阵中(去Q留Z),矩阵中其它未用到的字母按顺序填在矩阵剩余位置中,根据替换矩阵由密文得到明文。
    对密文解密规则如下:
    1 若c1 c2在同一行,对应明文p1 p2分别是紧靠c1 c2 左端的字母。其中最后一列被看做是第一列的左方。
    2 若c1 c2在同一列,对应明文p1 p2分别是紧靠c1 c2 上方的字母。其中最后一行被看做是第一行的上方。
    3 若c1 c2不在同一行,不在同一列,则p1 p2是由c1 c2确定的矩形的其他两角的字母。
    其实就是反其道而行之。

    加解密流程
    e09432cb-52ac-4a32-bca1-d2831de94865-image.png
    Playfair密码 Python实现
    见https://blog.csdn.net/qin_jin_blog/article/details/21886335
    (该脚本“如果在同一列”的情况处理有误,应改为plaintext+=T_letter[(x[0]-1)%5][x[1]]+T_letter[(y[0]-1)%5][y[1]])

    例子:
    BUUCTF中crypto的Cipher题
    82ac938c-2840-45e2-aa82-7dbfad25124d-image.png
    密钥为PLAYFAIR
    69b52c87-e44e-43d5-9e06-272f7e4367a1-image.png
    看一下解出来的明文,知道需要将J改回成I;
    flag{itisnotaproblemhavefun}


Log in to reply