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