加密数字C ++

时间:2011-10-15 14:56:56

标签: c++ encryption decimal

所以我试图通过在数字上加7来加密4位整数,然后将整数除以10。在我的程序中,我分别取每个数字,然后我需要将整个数字除以10。如何将所有单独的int组合成一个四位数?

#include "stdafx.h"
using namespace std;

int main()
{
    //Define all variables needed
    int a,b,c,d,enc,ext;

    //Print dialog and input each single digit for the four number digit
    cout << "Enter Your First Digit:" << endl;
    cin >> a;
    cout << "Enter Your Second Digit:" << endl;
    cin >> b;
    cout << "Enter Your Third Digit:" << endl;
    cin >> c;
    cout << "Enter Your Fourth Digit:" << endl;
    cin >> d;
    //Add seven to each digit
    a += 7;
    b += 7;
    c += 7;
    d += 7;

    a /= 10;
    b /= 10;
    c /= 10;
    d /= 10;

    cout << "Your encrpyted digits:" << c << d << a << b <<endl;

    cout << "Enter 1 to exit:" <<endl;
    cin >> ext;

    if (ext = 1) {
        exit(EXIT_SUCCESS);
    }
}

您可能已经注意到我将每个数字分开。我需要一起做。然后我也在创建一个解密,我将在单独的程序中将我带回原始号码。

5 个答案:

答案 0 :(得分:4)

根据您的评论,您尝试对Caesar Cipher进行变体处理,在这种情况下,您应该使用模数运算符(%)而不是整数除法运算符(/ )。使用整数除法会丢失将阻止您解密的信息。当你的数字在{0,1,2}时,你的除法产生0.当它在{3,4,5,6,7,8,9}时,除法产生1.你不能将{0,1}解密回原始号码,而没有一些额外的信息(你已经丢弃了)。

如果要使用Caesar Cipher方法逐位加密,则应使用modulo arithmetic,以便每个数字都具有唯一的加密值,可在解密期间检索。如果那真的是你想要的那么你应该做以下的事情来加密7:

    a = (a + 7) % 10;
    b = (b + 7) % 10;
    c = (c + 7) % 10;
    d = (d + 7) % 10;

要减去,你减去7,其中mod 10算术是3的加法,因此它将是:

    a = (a + 3) % 10;
    b = (b + 3) % 10;
    c = (c + 3) % 10;
    d = (d + 3) % 10;

这当然预先假定您已经正确验证了您的输入(上例中的情况并非如此)。

答案 1 :(得分:1)

这是你可能正在寻找的东西:

int e = (a*1000)+(b*100)+(c*10)+d;
e=e/10;

答案 2 :(得分:1)

将各个数字组合成一个四位数字很简单;只需将第一个数字加倍,加上第二个数字乘以100,依此类推。

但这是一种单向算法;你将永远无法从中检索原始的四位数字。

答案 3 :(得分:0)

从你的描述中不清楚添加是否应该是模10;如果是的话

((((((a % 10) * 10) + (b % 10)) * 10) + (c % 10)) * 10) + (d % 10) 

如果你不想要modulo 10

(((((a * 10) + b) * 10) + c) * 10) + d 

答案 4 :(得分:0)

撇开你几乎肯定想要mod而不是分裂的事实(如@Andand所说),将数字转换为数字的方法不止一种!

现在很多人使用解释语言可能会想要象征性地做这件事。 C ++也可以做到这一点,事实上相当简洁:

// create a string stream that you can write to, just like
// writing to cout, except the results will be stored
// in a string

stringstream ss (stringstream::in | stringstream::out);

// write the digits to the string stream
ss << a << b << c << d;

cout << "The value stored as a string is " << ss.str() << endl;

// you can also read from a string stream like you're reading
// from cin.  in this case we are reading the integer value
// that we just symbolically stored as a character string

int value;
ss >> value;

cout << "The value stored as an integer is " << value << endl;

在4位数字的这种狭窄情况下,它不会像乘法一样有效,因为往返于字符串和返回。但很高兴知道这项技术。此外,它的编码风格可以更容易维护和调整。

如果你#include <sstream>,你将获得stringstream。