暗号学


シーザーのパスワード


「シーザーパスワード」とも呼ばれています

暗号化時に送信するメッセージをn回押して暗号化します.
復号は非常に簡単です
ex) I love cookie.
key値暗号文3 4 5 6

復号コード

#include <stdio.h>
#include <string.h>

int main()
{
	char message[10000] = { 0, };
	char ch;
	int i, key;

	printf("Caesar Cipher Decryption\n");
	printf("\n");
	printf("Ciphertext: KYVXIVRKVJKXCFIPZECZMZEXCZVJEFKZEEVMVIWRCCZEXSLKZEIZJZEXVMVIPKZDVNVWRCC.EVCJFEDREUVCR.KYVNRPKFXVKJKRIKVUZJKFHLZKKRCBZEXREUSVXZEUFZEX.NRCKUZJEVP.PFLIKZDVZJCZDZKVUJFUFEFKNRJKVZKCZMZEXJFDVFEVVCJVJCZWV.UFEFKSVKIRGGVUSPUFXDR.NYZTYZJCZMZEXNZKYKYVIVJLCKJFWFKYVIGVFGCVJKYZEBZEX.JKVMVAFSJ.ZWCZWVNVIVGIVUZTKRSCVZKNFLCUTVRJVKFSVCZWVREUSVNZKYFLKWCRMFI.VCVREFIIFFJVMVCK.ZWPFLCFFBRKNYRKPFLYRMVZECZWVPFLNZCCRCNRPJYRMVDFIV.ZWPFLCFFBRKNYRKPFLUFEFKYRMVZECZWVPFLNZCCCEVMVIYRMVVEFLXY.FGIRYNZEWIVP.ZWPFLJVKPFLIXFRCJIZUZTLCFLJCPYZXYREUZKZJRWRZCLIVPFLNZCCWRZCRSFMVVMVIPFEVVCJVJJLTTVJJ.ARDVJTRDVIFE.CZWVZJNYRKYRGGVEJNYVEPFLRIVSLJPDRBZEXFKYVIGCREJ.AFYECVEEFE.JGIVRUCFMVVMVIPNYVIVPFLXF.CVKEFFEVVMVITFDVKFPFLNZKYFLKCVRMZEXYRGGZVI.DFKYVIKVIVJR.NYVEPFLIVRTYKYVVEUFWPFLIIFGVKZVRBEFKZEZKREUYREXFE.WIREBCZEU.IFFJVMVCK.RCNRPJIVDVDSVIKYRKPFLRIVRSJFCLKVCPLEZHLV.ALJKCZBVVMVIPFEVVCJV.DRIXRIVKDVRU.UFEFKALUXVVRTYURPSPKYVYRIMVJKPFLIVRGSLKSPKYVJVVUJKYRKPFLGCREK.IFSVIKCFLZJJKVMVEJFE.KYVWLKLIVSVCFEXJKFKYFJVNYFSVCZVMVZEKYVSVRLKPFWKYVZIUIVRDJ.VCVREFIIFFJVMVCK.KVCCDVREUZWFIXVK.KVRTYDVREUZIVDVDSVI.ZEMFCMVDVREUZCVRIE.SVEARDZEWIREBCZE.KYVSVJKREUDFJKSVRLKZWLCKYZEXJZEKYVNFICUTREEFKSVJVVEFIVMVEKFLTYVUKYVPDLJKSVWVCKNZKYKYVYVRIK.YVCVEBVCCVI.ZKZJULIZEXFLIURIBVJKDFDVEKJKYRKNVDLJKWFTLJKFJVVKYVCZXYK.RIZJKFKCV.NYFVMVIZJYRGGPNZCCDRBVFKYVIJYRGGPKFF.REEVWIREB.UFEFKXFNYVIVKYVGRKYDRPCVRUXFZEJKVRUNYVIVKYVIVZJEFGRKYREUCVRMVRKIRZC.IRCGYNRCUFVDVIJFE\n");
	printf("\n");
	printf("Key: 17\n");
	printf("\n");

	strcpy_s(message, 10000, "KYVXIVRKVJKXCFIPZECZMZEXCZVJEFKZEEVMVIWRCCZEXSLKZEIZJZEXVMVIPKZDVNVWRCC.EVCJFEDREUVCR.KYVNRPKFXVKJKRIKVUZJKFHLZKKRCBZEXREUSVXZEUFZEX.NRCKUZJEVP.PFLIKZDVZJCZDZKVUJFUFEFKNRJKVZKCZMZEXJFDVFEVVCJVJCZWV.UFEFKSVKIRGGVUSPUFXDR.NYZTYZJCZMZEXNZKYKYVIVJLCKJFWFKYVIGVFGCVJKYZEBZEX.JKVMVAFSJ.ZWCZWVNVIVGIVUZTKRSCVZKNFLCUTVRJVKFSVCZWVREUSVNZKYFLKWCRMFI.VCVREFIIFFJVMVCK.ZWPFLCFFBRKNYRKPFLYRMVZECZWVPFLNZCCRCNRPJYRMVDFIV.ZWPFLCFFBRKNYRKPFLUFEFKYRMVZECZWVPFLNZCCCEVMVIYRMVVEFLXY.FGIRYNZEWIVP.ZWPFLJVKPFLIXFRCJIZUZTLCFLJCPYZXYREUZKZJRWRZCLIVPFLNZCCWRZCRSFMVVMVIPFEVVCJVJJLTTVJJ.ARDVJTRDVIFE.CZWVZJNYRKYRGGVEJNYVEPFLRIVSLJPDRBZEXFKYVIGCREJ.AFYECVEEFE.JGIVRUCFMVVMVIPNYVIVPFLXF.CVKEFFEVVMVITFDVKFPFLNZKYFLKCVRMZEXYRGGZVI.DFKYVIKVIVJR.NYVEPFLIVRTYKYVVEUFWPFLIIFGVKZVRBEFKZEZKREUYREXFE.WIREBCZEU.IFFJVMVCK.RCNRPJIVDVDSVIKYRKPFLRIVRSJFCLKVCPLEZHLV.ALJKCZBVVMVIPFEVVCJV.DRIXRIVKDVRU.UFEFKALUXVVRTYURPSPKYVYRIMVJKPFLIVRGSLKSPKYVJVVUJKYRKPFLGCREK.IFSVIKCFLZJJKVMVEJFE.KYVWLKLIVSVCFEXJKFKYFJVNYFSVCZVMVZEKYVSVRLKPFWKYVZIUIVRDJ.VCVREFIIFFJVMVCK.KVCCDVREUZWFIXVK.KVRTYDVREUZIVDVDSVI.ZEMFCMVDVREUZCVRIE.SVEARDZEWIREBCZE.KYVSVJKREUDFJKSVRLKZWLCKYZEXJZEKYVNFICUTREEFKSVJVVEFIVMVEKFLTYVUKYVPDLJKSVWVCKNZKYKYVYVRIK.YVCVEBVCCVI.ZKZJULIZEXFLIURIBVJKDFDVEKJKYRKNVDLJKWFTLJKFJVVKYVCZXYK.RIZJKFKCV.NYFVMVIZJYRGGPNZCCDRBVFKYVIJYRGGPKFF.REEVWIREB.UFEFKXFNYVIVKYVGRKYDRPCVRUXFZEJKVRUNYVIVKYVIVZJEFGRKYREUCVRMVRKIRZC.IRCGYNRCUFVDVIJFE.");
	key = 17;
	for (i = 0; message[i] != '\0'; ++i) {
		ch = message[i];

		if (ch >= 'a' && ch <= 'z') {
			ch = ch - key;

			if (ch < 'a') {
				ch = ch + 'z' - 'a' + 1;
			}

			message[i] = ch;
		}
		else if (ch >= 'A' && ch <= 'Z') {
			ch = ch - key;

			if (ch < 'A') {
				ch = ch + 'Z' - 'A' + 1;
			}

			message[i] = ch;
		}
		else if (ch == '.') {
			message[i] = ch;
		}
	}

	printf("plaintext: %s\n", message);

	return 0;
}

ビズネルパスワード


キーワードを使用するパスワードで、複数の単文字置換パスワードの1つです.
<メリット>
  • 周波数分析法では解読できません.
  • ユーザーの鍵の数は無限です.

  • ex)
    ジョンウィック
    Key値:sky

    パスワード:byffgguu

    復号コード

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
        char message[10000] = { 0, };
        char key[10] = { 0, };
        char msg_char, key_char;
        int i, msg_len, key_len;
    
        printf("Vigenere Cipher Decryption\n");
        printf("\n");
        printf("Ciphertext: SQRQEDCUENMSUENMSUENMSUENMSZLIDHYIFVCFVCKIJITROKWMIDCENCDCENCDCENCDCENCWDAEKFZRGKZCQYPOMSRSHVFRKBUWBBOEHSLFRRDCPIENNGXMVOAVWOWSJTAMSWSRLCKLMIVRRDCVRRDCVRRDCVRRDCMVEHISRLCKIJIIDUFISYBRRDYBRRDYBRRDSHXSECCEENNCEENNCECEKVZXHBCNQYROEHSEDZRTRSRMRCCDITSAVWSKMZRGKMVSHQCKXAVSKKOSKRRNKQVPELFRXEKBUPIFSDCLSTVWAIWEKAICYFALMCITCUFGAEGVAEQCEVOMYKLICQCYBGSXSNQCRPLXWXLTGSXSNVWXLTSHLTLSYVMTCRPRAWWKICKIJIIDCCHYYIFRCOBFAIDCCHYYIKAIMSNIGYBCMGRHZXUZZZOESHJHYXODMTOWTEMOHFQOFSDSVOAFZEWCMIGOHFYTDVVAAICWQEKBUQYMFVACBSNGROKTVEGWDMNDVVGLEPJSIWUFRNKRFHONCUSJEGKAHKHKLEPITOCKAVLEBSKSDYRFHONCPIARMVEHMOLWESHXSECCEENNCEENNCEENNWKKOOGFRAXRFRAXRFRYOOYMTRFFAMIVRRDCIGMNDVVEIBGFQEDWDISCOPMNQOPSHQCKXAVSKKOSKRRNKQVPELFRXEKBUPIFSDCLSTVWAIWEKAICYFALMCITCUFGAEGVAEQCEVOMYKLICQCYBGSXSNQCRPLXWXLTGSXSNVWXLTSHLTLSYVMTCRPRAWWKICKIJIIDCCHYYIFRCOBFAIDCCHYYIKAIMSNIGYBCMGRHZXUZZZOESHJHYXODMTOWDKOXBRXAUSZXAVZZMMQCERALSKLEVOJXOXSJXAXRZRGRWXLEBCMIRKZCMIWUFRNKPVXHOZRWTYBVPAXRZRGMOLWESWZFEVWVZESHRRDSWZMJEGKAAXHZXAVZZNUCHNENDWKELVWDKOXBRTUDAPLAXRJMNDVVEIBVRRDCWEXHOOZVPEHPSUBVRRDCWEXHOOZVIDVISWWMYENNGLTIXHYIASFJSMOHZQECGRCIXURCORUFXTKZVXGYWNENXOTILOPIETOOEHLSJVQYVWWISKMZRGKMFLBKPPPEDGXSCKIJIWOUFRRYQBXHSGTPULKVKOXUFELVBZKHDKVKOXZZKHDWKYPVWBIIDGUCNKAZXEMOLWESHFPDICLSNMSESWSHFPDICLXWSQVAEQCEPIQVKMTEDCMKOWKWDIBRQIDS\n");
        printf("\n");
        printf("Key: korea\n");
        printf("\n");
    
        strcpy_s(message, 10000, "SQRQEDCUENMSUENMSUENMSUENMSZLIDHYIFVCFVCKIJITROKWMIDCENCDCENCDCENCDCENCWDAEKFZRGKZCQYPOMSRSHVFRKBUWBBOEHSLFRRDCPIENNGXMVOAVWOWSJTAMSWSRLCKLMIVRRDCVRRDCVRRDCVRRDCMVEHISRLCKIJIIDUFISYBRRDYBRRDYBRRDSHXSECCEENNCEENNCECEKVZXHBCNQYROEHSEDZRTRSRMRCCDITSAVWSKMZRGKMVSHQCKXAVSKKOSKRRNKQVPELFRXEKBUPIFSDCLSTVWAIWEKAICYFALMCITCUFGAEGVAEQCEVOMYKLICQCYBGSXSNQCRPLXWXLTGSXSNVWXLTSHLTLSYVMTCRPRAWWKICKIJIIDCCHYYIFRCOBFAIDCCHYYIKAIMSNIGYBCMGRHZXUZZZOESHJHYXODMTOWTEMOHFQOFSDSVOAFZEWCMIGOHFYTDVVAAICWQEKBUQYMFVACBSNGROKTVEGWDMNDVVGLEPJSIWUFRNKRFHONCUSJEGKAHKHKLEPITOCKAVLEBSKSDYRFHONCPIARMVEHMOLWESHXSECCEENNCEENNCEENNWKKOOGFRAXRFRAXRFRYOOYMTRFFAMIVRRDCIGMNDVVEIBGFQEDWDISCOPMNQOPSHQCKXAVSKKOSKRRNKQVPELFRXEKBUPIFSDCLSTVWAIWEKAICYFALMCITCUFGAEGVAEQCEVOMYKLICQCYBGSXSNQCRPLXWXLTGSXSNVWXLTSHLTLSYVMTCRPRAWWKICKIJIIDCCHYYIFRCOBFAIDCCHYYIKAIMSNIGYBCMGRHZXUZZZOESHJHYXODMTOWDKOXBRXAUSZXAVZZMMQCERALSKLEVOJXOXSJXAXRZRGRWXLEBCMIRKZCMIWUFRNKPVXHOZRWTYBVPAXRZRGMOLWESWZFEVWVZESHRRDSWZMJEGKAAXHZXAVZZNUCHNENDWKELVWDKOXBRTUDAPLAXRJMNDVVEIBVRRDCWEXHOOZVPEHPSUBVRRDCWEXHOOZVIDVISWWMYENNGLTIXHYIASFJSMOHZQECGRCIXURCORUFXTKZVXGYWNENXOTILOPIETOOEHLSJVQYVWWISKMZRGKMFLBKPPPEDGXSCKIJIWOUFRRYQBXHSGTPULKVKOXUFELVBZKHDKVKOXZZKHDWKYPVWBIIDGUCNKAZXEMOLWESHFPDICLSNMSESWSHFPDICLXWSQVAEQCEPIQVKMTEDCMKOWKWDIBRQIDS");
        strcpy_s(key, 10, "korea");
        msg_len = strlen(message);
        key_len = strlen(key);
    
        for (i = 0; i < msg_len; i++)
        {
            if (message[i] >= 'A' && message[i] <= 'Z')
                msg_char = 'A';
            else if (message[i] >= 'a' && message[i] <= 'z')
                msg_char = 'a';
            if (key[i % key_len] >= 'A' && key[i % key_len] <= 'Z')
                key_char = 'A';
            else if (key[i % key_len] >= 'a' && key[i % key_len] <= 'z')
                key_char = 'a';
            
            message[i] = ((message[i] - msg_char - key[i % key_len] + key_char + 26) % 26) + msg_char;
        }
    
        printf("plaintext: %s\n", message);
        return 0;
    }