0

私はこの自動キー暗号をどのように実装できるかを考え出そうとしていますが、ほとんどうまくいったと思います。暗号は、アルファベットの文字位置を使用するサブキー スタイル システムを使用することになっています。

現在、いくつかの記号「;:,.」の処理方法に行き詰まっています。それらが暗号化または復号化文字列の一部として入力され、言語に慣れていないため、それにアプローチする方法がわからない場合。ガイダンスや方向性は素晴らしいでしょう。コードと暗号がどのように機能するかの例を以下に示します。

暗号の説明: ここに画像の説明を入力

#include <iostream>
#include <string>
#include <assert.h>

using namespace std;

//Declares
char autokeyE(int, int);
char autokeyD(char);
char numToLetter(int);
int letterToNum(char);

int main()
{
    //Declares
    string inputText, finalText;
    int firstAlpha = 0;
    int key = 0;
    int option = 0;


    //First Values
    do
    {
        cout << "What operation would you like to do? Press '1' for Encrypt and '2' for Decrypt." << endl ;
        cin >> option;

        if (option == 1)
        {
            cout << "Please input your plain text to encrypt." << endl ;
            cin >> inputText;
            cout << "Please input your key to encrypt with." << endl;
            cin >> key;

            string finalText = "";

            firstAlpha = letterToNum(inputText[0]);
            finalText = numToLetter((firstAlpha + key) %26);
            //inputText[0] = finalText[0];

            for (int x = 1; x < inputText.length(); x++)
            {

                finalText += autokeyE(letterToNum(inputText[x-1]), letterToNum(inputText[x]));
            }
            cout << finalText << endl;
        }

        if (option == 2)
        {
            cout << "Please input your encrypted text to decrypt." << endl ;
            cin >> inputText;
            string finalText = "";

            firstAlpha = letterToNum(inputText[0]);
            finalText = numToLetter((firstAlpha + key) %26);

            for (int x = 1; x < inputText.length(); x++)
            {
                //cout << inputText[x]; Testing output
                finalText += autokeyD(inputText[x]);
            }
            cout << finalText << endl;
        }
    }
    while (!inputText.length() == 0);
}

char autokeyE(int c, int n)
{
    cout << "Keystream: " << n << " | Current Subkey: " << c << endl;

        int result = 0;
        //c = toupper(c);
        result = ((c + n) +26 )%26;
        cout << "C as a numtoletter: " << numToLetter(result) << " Result: " << result << endl;
        return numToLetter(result); 
    return c;
}

char autokeyD(char c)
{
    //Decrypting Shift -1
    if (isalpha(c))
    {
        c = toupper(c); 
        c = (((c - 65) - 1) % 26) + 65;
    }
    return c;
}

char numToLetter(int n)
{
    assert(n >= 1 && n <= 32);
    return "ABCDEFGHIJKLMNOPQRSTUVWXYZ ;:,."[n];  
}

int letterToNum(char n)
{
    if (isalpha(n))
    {
        n = toupper(n);
        return(int) n - 65; 
    }
    else 
    {
        cout << "REUTRNING A NON ALPHA CHARACTER AS: " << n << endl;
        return(int) n -30;
    }

}
4

2 に答える 2

0

isPunct次のような C++を使用してシンボルを処理できます。

if (isPunct(inputText[x]) {
    //do whatever it is you need to do
}
于 2017-11-21T07:20:30.590 に答える
0

私はあなたの質問を理解していませんが、答えは、機能しない各文字の前にバックスラッシュを付けることだと思います"\;\:\,\."

于 2017-11-21T05:47:14.313 に答える