生成随机密钥

时间:2010-08-28 15:06:43

标签: c++

我被赋予了生成随机80字节密钥的任务,我已经决定了以下策略

在我的电脑sizeof(char)=1中,所以我创建了一系列英文字母

char *p=" ";
char a[0..26] and in cycle 


for (int  i=0;i<=80;i++){
   *(p+i)+= a[(rand()+100) % 26];
}

但它不起作用它停止执行请帮助对不起,如果我的代码是愚蠢但我不能在这个时候想 谢谢 代码

#include <iostream>
#include <string.h>
#include <cstdlib>
using   namespace std;
int main(){

    char *p=" ";
    char  a[]= { 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
 for (int i=0;i<=80;i++){
        *(p+i)+=(a[(rand()+100)%26]);
    }

     cout<<p<<endl;


     return 0;

}

7 个答案:

答案 0 :(得分:3)

好吧,通常我会说你需要提供比“它停止执行”更多的信息,但是有些事情突然发生在我身上:

    char *p=" ";
    char  a[]= { 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
    for (int i=0;i<=80;i++){
         *(p+i)+=(a[(rand()+100)%26]);
    }

你的循环是将值从索引0写入*p到80(总共81个元素)。

第一次迭代迭代:

*(p+0) = a[...]; 

会起作用,但第二个

*(p+1) = a[...];

应该失败,因为地址*(p + 1)没有保留内存。如果您可以写入为字符串文字附加的空\0保留的空间,则可以将其关闭。

当您声明* p为

char *p=" ";

你只分配1个字节。所以,当你的循环写入p [1]时,p [2] ......你正在尝试写入未分配的内存。将您的声明更改为

char pArr[81];
char *p=pArr;

从那里开始。

答案 1 :(得分:2)

试试这个:

#include <iostream>
#include <string.h>
#include <cstdlib>
using   namespace std;
int main(){
    // ensure the target has enough memory for the key and a null terminator
    char p[81];

    // this string will do as nicely as the character array
    char a[] = "abcdefghijklmnopqrstuvwxyz";

    // no += here. I assign the random character directly to the target buffer
    for (int i=0;i<=80;i++)
        p[i] = a[rand()%26];

    // alternately, you can calculate a random English character with:
    // p[i] = rand()%26 + 'a';
    // which removes the need for the a[] buffer at all

    // don't forget to null-terminate
    p[80] = '\0'

    // output results
    cout<<p<<endl;
    return 0;
}

答案 2 :(得分:1)

在循环中写入之前,需要为char数组p的完整大小分配空间。


更新顺便说一句,rand()如果不首先使用srand使用唯一值播种,则{{1}}不是很随机。

答案 3 :(得分:1)

您正在p变量中分配字符,但尚未分配内存来分配这些字符。你可能想要这样的东西:

char p[81];

然后从那里开始。

答案 4 :(得分:1)

我修改了你的代码......试一试。

#include <iostream>
#include <string.h>
#include <cstdlib>
using namespace std;
int main(){

    char *p= new char[81];
    char  a[]= { 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
 for (int i=0;i<=80;i++){
        *(p+i)=(a[(rand()+100)%26]);
    }

     cout<<p<<endl;


     return 0;

}

那么输出是什么?

答案 5 :(得分:1)

关于此代码的问题:

为什么要生成一个字母字符数组?为什么不随机调制,调制26,并将偏移量添加到ASCII“a”?这节省了内存分配,在我看来更清楚。

答案 6 :(得分:0)

为了完整性:

std::vector<char> BuildKey(std::size_t keyLength)
{
    const char elements[] = "abcdefg0123!@_";
    const std::size_t numElements = sizeof(elements) / sizeof(char);
        //division technically superfluous, as sizeof(char) == 1, but in general its needed.

    std::vector<char> key;
    key.reserve(keyLength);
    for(std::size_t i = 0; i < keyLength; ++i) 
        key.push_back(elements[rand()%numElements]);
    //there are a handful of ways using standard algorithms to achieve this,
    //  but I'm largely unconvinced the added complexity is justified for simple loops

    return key;
}

还可以进行一些更改。我可能会对rand进行参数化,以便我可以稍后选择我的PRNG,并可能提供elements数组作为输入。 string可能比vector更合适,具体取决于您计划如何使用密钥。或者只是接受ForwardIterator,然后返回void。很多选择。