LoginSignup
0
0

More than 3 years have passed since last update.

【C言語学習】パスワード生成プログラムを作ってみた

Last updated at Posted at 2021-04-13

概要

Webサービスのユーザー登録やファイルの暗号化など、、
パスワードとしてランダムな文字列を生成したい時ってたまにあると思います。

"パスワード生成" でググれば、ボタン一つでパスワードを作ってくれるPHPなWebサイトが簡単に見つかるでしょう。
しかし、「これから使用しようとしているパスワードを誰かに握られているって、情報セキュリティの観点的にどうなの?」と思ったのと、
C言語を1ヶ月間勉強した事だしその知識を活用する良い機会だな、という事で作ってみました。

環境

Ubuntu 20.04 LTS on Windows Subsystem for Linux (WSL2)
gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0

コード

genrandstr.c
/* *********** genrandstr.c *********** */
/*   Generates a random string          */
/*                                      */
/*   1st release: 2021-04-13            */
/*   Last update: 2021-04-15            */
/*   Author: Y. Kosaka                  */
/*   See the web for more information   */
/*   https://qiita.com/x-ia             */
/* ************************************ */

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int     main(int argc, char **argv)
{
    char    c;
    char    c_range[3][2];
    char    c_tmp;
    int     i;
    int     n;

    i = 0;
    n = 0;
    c = 0x00;
    c_tmp = 0x00;
    c_range[0][0] = 0x21;
    c_range[0][1] = 0x7e;
    c_range[1][0] = 0x01;
    c_range[1][1] = 0x00;
    c_range[2][0] = 0x01;
    c_range[2][1] = 0x00;

    if (argc > 2)
    {
        while (*(argv[2] + n) != 0x00 && n < 6)
            n++;
        while (n > 1)
        {
            i = n / 2 - 1;
            c_range[i][0] = argv[2][n / 2 * 2 - 2];
            c_range[i][1] = argv[2][n / 2 * 2 - 1];
            if (c_range[i][0] > c_range[i][1])
            {
                c_tmp = c_range[i][0];
                c_range[i][0] = c_range[i][1];
                c_range[i][1] = c_tmp;
            }
            n -= 2;
        }
    }

    if (argc > 1)
        n = atoi(argv[1]);
    if (n < 1)
        n = 8;

    srand((unsigned int)time(NULL));
    i = 0;
    while (i < n)
    {
        c = rand();
        if ((c >= c_range[0][0] && c <= c_range[0][1]) || \
            (c >= c_range[1][0] && c <= c_range[1][1]) || \
            (c >= c_range[2][0] && c <= c_range[2][1]))
        {
            printf("%c", c);
            i++;
        }
    }
    printf("\n");
    return (0);
}

使用方法

  1. gcc でコンパイルします。
  2. 第1引数で、文字数を指定します。
    • 10 のように、算用数字で指定します。
    • atoi関数により、引数の頭の整数部分が採用されます。
    • 指定が無い場合は、8文字となります。
  3. 第2引数で、使用する文字の範囲を指定します。
    • AZ とすると、ASCIIコードでA―Zの範囲にある文字から選ばれます。
    • 09AF とすれば、0―9及びA―Fとなり、16進数のように使用可能です。
    • AZaz09 のように最大3つの範囲を指定可能です。
    • 指定が無い場合は、'!'(0x21) ― '~'(0x7E) となります。
  4. プログラムを実行し、出力された文字列を確認します。
0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0