我在C ++中基于密码的基本加密方法工作不正常,我该如何解决?

时间:2017-04-14 19:34:39

标签: c++ string encryption

void encrypt(char *string){
    int i, shift;
    for(i = 0; i < 4; i++){
        shift = 12+i;
        while(((int)string[i]+shift) > 122){
            shift-=26;
        }
        string[i]+=shift;
    }
    for(i = 4; i < 6; i++){
        shift = 12+i;
        while(((int)string[i]+shift) > 90){
            shift-=26;
        }
        string[i]+=shift;
    }
    for(i = 6; i < 8; i++){
       shift = 12+i;
        while(((int)string[i]+shift) > 57){
            shift-=10;
        }
        string[i]+=shift;
    }
    for(i = 8; i < 10; i++){
        shift = 12+i;

        if((((int)string[i])>=33)&&(((int)string[i])<=47)){
            while(((int)string[i]+shift) > 47){
                shift-=15;
            }
        }
        else{
            while(((int)string[i]+shift) > 64){
                shift-=7;
            }
        }
        string[i]+=shift;
    }
}

我使用此函数来加密一个10个字符的字符串,其中前4个将是小写字母,接下来的2个将是大写字母,接下来的2个是一些数字,最后2个将是一些特殊字母字符。因此,据推测,它会移动其范围内的每个字符(并将加密的替换包装回到范围的开头,如果它落在其中),具体取决于字符在字符串中的位置。移位等于12+ [字符串中字符的索引]。 (要知道为什么我在最后一个循环中完成了所有这些,你可以在任何ascii chart中看到有两组不同的特殊字符)。

现在的问题是,除了第一个字符外,该函数正在移动其范围内的每个字符。 (好吧,我没有检查它是否给出了正确的替换。我只是看到替换是来自相同的范围(如小写字母的小写字母和数字的数字)并假设它正常工作他们:P)第一个替换是一些奇怪的无法识别的角色。我使用了Borland编译器。是编译器吗?这是代码吗?

1 个答案:

答案 0 :(得分:2)

我建议将所有有效字符放入字符串,然后使用%运算符。

const std::string valid_characters = 
     "abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*";
const unsigned int shift_offset = 13;

std::string::size_type position = valid_characters.find(incoming_character);
position = (position + shift_offset) % valid_characters.length();
char result = valid_characters[position];

您必须检查position值,因为如果find字符串中不存在该字符,std::string::npos将返回valid_characters