• java实现第二届蓝桥杯异或加密法


    异或加密法.
    在对文本进行简单加密的时候,可以选择用一个n位的二进制数,对原文进行异或运算。
    解密的方法就是再执行一次同样的操作。

    加密过程中n位二进制数会循环使用。并且其长度也可能不是8的整数倍。

    下面的代码演示了如何实现该功能。
    请仔细阅读,填写空缺的代码(下划线部分)。

    void f(char* buf, unsigned char* uckey, int n)
    {
    
        int i;
        for(i=0; i<n; i++)
            buf[i] = buf[i] ^ uckey[i];    //异或运算,即:buf[i] ^= uckey[i]
    }
    
    int main(int argc, char* argv[])
    {
        char p[] = "abcd中国人123";  // 待加密串
    
        char* key = "11001100010001110";  //以串的形式表达的密匙,运算时要转换为按位存储的形式。
    
        int np = strlen(p);
        int nk = strlen(key);
        unsigned char* uckey = (unsigned char*)malloc(np);  // unsigned char是无符号字节型,char类型变量的大小通常为1个字节(1字节=8个位)    
        // 密匙串需要按位的形式循环拼入 uckey中
        int i;
        for(i=0; i<np*8; i++)
        {
            if(key[i%nk]=='1')
                ______;  // 填空1按位或
            else
                ______;  // 填空2按位与
        }
        
        f(p, uckey, strlen(p));
        f(p, uckey, strlen(p));
    
        printf("%s
    ", p);
    
        free(uckey);
    
        return 0;
    }
    
    
    uckey[i/8] |= (unsigned char)0x80 >> (i%8)
    uckey[i/8] &= ~((unsigned char)0x80 >> (i%8))
    
    本题满分:14分
      
      填空1:(7分)
      uckey[i/8] |= (unsigned char)0x80 >> (i%8);    //>>表示右移位,位逻辑运算符:&按位与,|按位或,^按位异或,~取反,移位运算符:<<左移,>>右移
    从数学上看,左移1位等于乘以2,右移1位等于除以2,然后再取整,移位溢出的丢弃
     
      填空2:(7分)
      uckey[i/8] &= ~((unsigned char)0x80 >> (i%8));
     
      注意所有逻辑等价形式都是正确的答案,比如可以使用左移位:
      (unsigned char)0x80 >> 2  等价于:0x01 << 5
    
  • 相关阅读:
    ZOJ3513_Human or Pig
    ZOJ2083_Win the Game
    ZOJ2725_Digital Deletions
    ZOJ2686_Cycle Gameu
    UVALive
    ZOJ2290_Game
    ZOJ3067_Nim
    P3159 [CQOI2012]交换棋子(费用流)
    P3153 [CQOI2009]跳舞(最大流多重匹配)
    P3121 [USACO15FEB]审查(黄金)Censoring (Gold)(ac自动机)
  • 原文地址:https://www.cnblogs.com/a1439775520/p/12947361.html
Copyright © 2020-2023  润新知