- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是一个简单的概念,不是很安全,但只是一个练习类(class),因为我是一个非常早的初学者(2 到 3 周)
我基本上想在每个字母后的输入消息中插入随机数量的随机字符,如数字和表达式。因此,例如, “HELLO” 将成为 “ħ 45 ë [./43 大号/54 大号 43 [] ö”。
然而,我似乎只是找回了确切的输入,而没有在两者之间添加行话。有任何想法吗?
这是我的代码:
#include <iostream>
#include <ctime>
#include <string>
std::string encryptFunc(std::string address){
int i = 0;
int store = address.length();
std::string Output;
while(i < store){
if(address[i] == ' ' || address[i] == 'a' || address[i] == 'b' || address[i] == 'c' || address[i] == 'd' || address[i] == 'e' || address[i] == 'f' || address[i] == 'g' || address[i] == 'h' || address[i] == 'i' || address[i] == 'j' || address[i] == 'k' || address[i] == 'l' || address[i] == 'm' || address[i] == 'n' || address[i] == 'o' || address[i] == 'p' || address[i] == 'q' || address[i] == 'r' || address[i] == 's' || address[i] == 't' || address[i] == 'u' || address[i] == 'v' || address[i] == 'w' || address[i] == 'x' || address[i] == 'y' || address[i] == 'z' || address[i] == 'A' || address[i] == 'B' || address[i] == 'C' || address[i] == 'D' || address[i] == 'E' || address[i] == 'F' || address[i] == 'G' || address[i] == 'H' || address[i] == 'I' || address[i] == 'J' || address[i] == 'K' || address[i] == 'L' || address[i] == 'M' || address[i] == 'N' || address[i] == 'O' || address[i] == 'P' || address[i] == 'Q' || address[i] == 'R' || address[i] == 'S' || address[i] == 'T' || address[i] == 'U' || address[i] == 'V' || address[i] == 'W' || address[i] == 'X' || address[i] == 'Y' || address[i] == 'Z'){
srand(time(NULL));
int randJargonSelect = rand()%26; //which character of individual jargon is currently selected to be placed
char jargonSelection[] = {'1','2','3','?', '<', '~', '@', '/', '#', '+', '*', '&', '^', '%', '$', '!', '-', '0', '9', '8', '7', '6', '5', '4', '`', '|' };
char randPlacementJargon = jargonSelection[randJargonSelect]; //the variable holder for the character of jargon to place
int randJargonAmount = rand()%500; //the amount of jargon chars to place
Output = address[i], randPlacementJargon * randJargonAmount;
}
std::cout << Output;
i++;
};
std::string nada = " ";
return nada;
}
int main(){
std::string userin;
std::cout << "Please enter the message you wish to encrypt" << std::endl;
std::cout << "Enter here: "; std::getline(std::cin, userin);
std::cout << " " << std::endl;
std::cout << "Here is your Encoded Message: " << encryptFunc(userin) << std::endl;
std::cout << " " << std::endl;
system("pause");
return 0;
}
再次感谢。我知道可能有 100 种更好的方法可以做到这一点,但我只是为了学习而想了解它。
最佳答案
首先,让我们谈谈风格。您的代码的外观对于可读性极其重要,不仅对您自己,而且对其他人。有一些工具可以为您设计代码样式,例如 clang-format。这是您的代码,唯一的变化是我通过设置为 Google 样式的 clang-format 运行您的代码。我选择这种风格是因为它看起来很适合在这个网站上展示。
无论您是否使用工具,了解并使用良好且一致的风格都很重要。
#include <ctime>
#include <iostream>
#include <string>
std::string encryptFunc(std::string address) {
int i = 0;
int store = address.length();
std::string Output;
while (i < store) {
if (address[i] == ' ' || address[i] == 'a' || address[i] == 'b' ||
address[i] == 'c' || address[i] == 'd' || address[i] == 'e' ||
address[i] == 'f' || address[i] == 'g' || address[i] == 'h' ||
address[i] == 'i' || address[i] == 'j' || address[i] == 'k' ||
address[i] == 'l' || address[i] == 'm' || address[i] == 'n' ||
address[i] == 'o' || address[i] == 'p' || address[i] == 'q' ||
address[i] == 'r' || address[i] == 's' || address[i] == 't' ||
address[i] == 'u' || address[i] == 'v' || address[i] == 'w' ||
address[i] == 'x' || address[i] == 'y' || address[i] == 'z' ||
address[i] == 'A' || address[i] == 'B' || address[i] == 'C' ||
address[i] == 'D' || address[i] == 'E' || address[i] == 'F' ||
address[i] == 'G' || address[i] == 'H' || address[i] == 'I' ||
address[i] == 'J' || address[i] == 'K' || address[i] == 'L' ||
address[i] == 'M' || address[i] == 'N' || address[i] == 'O' ||
address[i] == 'P' || address[i] == 'Q' || address[i] == 'R' ||
address[i] == 'S' || address[i] == 'T' || address[i] == 'U' ||
address[i] == 'V' || address[i] == 'W' || address[i] == 'X' ||
address[i] == 'Y' || address[i] == 'Z') {
srand(time(NULL));
int randJargonSelect =
rand() % 26; // which character of individual jargon is currently
// selected to be placed
char jargonSelection[] = {'1', '2', '3', '?', '<', '~', '@', '/', '#',
'+', '*', '&', '^', '%', '$', '!', '-', '0',
'9', '8', '7', '6', '5', '4', '`', '|'};
char randPlacementJargon =
jargonSelection[randJargonSelect]; // the variable holder for the
// character of jargon to place
int randJargonAmount =
rand() % 500; // the amount of jargon chars to place
Output = address[i], randPlacementJargon * randJargonAmount;
}
std::cout << Output;
i++;
};
std::string nada = " ";
return nada;
}
int main() {
std::string userin;
std::cout << "Please enter the message you wish to encrypt" << std::endl;
std::cout << "Enter here: ";
std::getline(std::cin, userin);
std::cout << " " << std::endl;
std::cout << "Here is your Encoded Message: " << encryptFunc(userin)
<< std::endl;
std::cout << " " << std::endl;
return 0;
现在,让我们看看您的代码。我将从 main 函数开始,因为它更小。这里有两件小事,一件可以说是有些主观的。
std::cout << " " << std::endl;
行完全没有必要。如果您只想要一个空行,请打印
'\n'
(换行符)。而且您也不需要完整的声明,只需将其粘贴在下一个实际
cout
的开头即可。
std::cout << "\nHere is your Encoded Message: " << ...
。第二件事是比
'\n'
更喜欢
std::endl
。
std::endl
做两件事,打印
'\n'
并刷新流。您不必经常冲洗流。
encryptFunc()
的结果,但它返回一个空格,即您在函数末尾声明并返回的空格。你的函数也会打印,这很糟糕。
encryptFunc()
,而不是
encryptAndPrintFunc()
。您也不需要使用任何形式的“func”来命名您的函数。我们都知道这是一个函数。而且你并没有真正加密,我会说它更像是填充,所以我要更改名称。
std::string pad(std::string message) { ... }
所以我们有了这个,而且你的代码打算做什么已经更容易理解了。
Output
重命名为
output
。以大写字母开头的名称通常保留给类/结构。您想在空格或字母后填充。你的 if 有一个庞大的 bool 表达式。我们将把这个循环改为 for 循环,并使用库
<cctype>
简化事情。这是一个很棒的 ASCII 工作库。如果您不知道 ASCII 是什么,请查找 ASCII 表。对于初学者编程的东西,ASCII 很棒。循环更改意味着我们不需要
i
(无论如何都不是您使用它的方式)或存储。
std::string pad(std::string message) {
std::string output;
for (auto c : message) {
if (std::isalpha(c) || std::isspace(c)) {
// Still working
我使用的 for 循环是基于范围的 for 循环。
i
的值将是
char
的每个
message
。接下来,我们将为 C++ 版本更改旧的 C 样式随机数内容。这涉及
<random>
。
std::string pad(std::string message) {
std::string output;
const std::string jargon("123456790?<>~@/#+*&^%$!-`|");
static std::mt19937 prng(std::random_device{}());
static std::uniform_int_distribution<std::size_t> jargonSelector(
0, jargon.length() - 1);
static std::uniform_int_distribution<int> numJargon(1, 5);
for (auto c : message) {
if (std::isalpha(c) || std::isspace(c)) {
// Still working
关键字
static
用于多次调用此函数的情况。如果是这种情况,您不想不断地重新初始化您的伪随机数生成器或分布。
static
是我们实现这一目标的方式。
const
确保
jargon
永远不会被修改。
output = message[i], randPlacementJargon * randJargonAmount;
不符合您的预期。
comma operator 执行第一个表达式,丢弃结果,并返回第二个表达式的结果。因此,您将输出保存为单个字符,然后进行了未保存在任何地方的随机乘法。这就是为什么再次打印原始字符串的原因,您的函数一次只打印一个字符。
-Wall -Wextra
应该被认为是强制性的。让编译器帮你。
#include <iostream>
#include <random>
#include <string>
std::string pad(std::string message) {
std::string output;
const std::string jargon("123456790?<>~@/#+*&^%$!-`|");
static std::mt19937 prng(std::random_device{}());
static std::uniform_int_distribution<std::size_t> jargonSelector(
0, jargon.length() - 1);
static std::uniform_int_distribution<int> numJargon(1, 5);
for (auto c : message) {
if (std::isalpha(c) || std::isspace(c)) {
int padSize = numJargon(prng);
output.push_back(c);
for (int i = 0; i < padSize; ++i) {
output.push_back(jargon[jargonSelector(prng)]);
}
}
};
return output;
}
int main() {
std::string userin;
std::cout << "Please enter the message you wish to encrypt" << '\n';
std::cout << "Enter here: ";
std::getline(std::cin, userin);
std::cout << "\nHere is your Encoded Message: " << pad(userin) << '\n';
std::cout << " " << '\n';
return 0;
}
一旦确定一个字符是字母或空格(值得注意的是
std::isspace
对任何空白字符都返回 true):确定 pad 的大小,将原始字母推回输出,然后一个小循环将 pad 推回大小的“行话”字符。
output
而不是您返回的单个空格空字符串。我还从函数中删除了打印语句,因为那不是函数的工作。
Please enter the message you wish to encrypt
Enter here: Hello World!
Here is your Encoded Message: H@32e~/l94l%-4o5`> ?#W/o*5!r>!l&+@d15~3
关于c++ - 尝试创建一个基本的 "encrypter",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66408800/
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 8 年前。 Improve this ques
我heard “PKCS#1 v2.0 加密通常称为 OAEP 加密”。 在我的项目中使用它之前,我需要某种“官方”文档来说明这一点。我试图找到它但没有成功。知道在哪里可以找到吗? 谢谢! (顺便说一
已锁定。这个问题及其答案是locked因为这个问题是题外话,但却具有历史意义。目前不接受新的答案或互动。 来自:加密公司 收件人:x$*sj4(就是你) 如果您选择接受的话,您的任务是用最短的击键次数
我正在使用带有 docker/docker compose 和 traefik 的 ubuntu 18.04.1 LTS。使用暂存 Let's Encrypt caserver ( https://a
我目前正在完成一篇关于通过各种密码算法加密数据的论文。 我花了很多时间阅读期刊和论文,但还没有找到任何关于它们的性能复杂性的记录。 有人知道以下算法的 Big-O 复杂度吗? RSA DES 三重 D
我正在为嵌入式系统(微 Controller )编写固件。固件可以通过引导加载程序(也是我编写的)进行更新。 现在需要采取措施防止固件被操纵,因此系统必须仅执行具有某种有效签名的下载固件。 固件文件已
我试图了解加密(“受密码保护”)Office 2007 文档(特别是 Excel 文档)的捆绑方式。我正在试验一个已知的、受密码保护的电子表格。 当我解压 XLSX 文件时,我遇到了三个条目: [6]
K8s对encrypt secret data具有此功能,这需要修改kube-apiserver配置,我如何在GKE中做到这一点? 最佳答案 简短的答案是,你不能。 Kubernetes Engine
我正在使用 ENCRYPT() 函数在 mysql 中存储一个字符串。我想获取匹配该字符串的行,但新的 ENCRYPT() 调用给了我一个不同的值,因此它们永远不会匹配。 这是预期的,因为我没有(也不
在带有 Python 2.7 和 GPG4Win v2.2.0 的 Windows 7 上使用 python-gnupg v0.3.5 test_gnupg.py 导致 2 次失败: Test tha
我尝试兼容 C# 和 Java 的加密/解密。 据我所知,默认模式在 Java 中是“ecb/pkcs5”,在 C# 中是“cbc/pkcs7”。 所以我匹配这些东西。 第一个问题是 PKCS7 和
我使用 SwiftyRSA 使用带有 PKCS1 填充的公钥加密字符串。不幸的是,当我用 Java 解密我的加密字符串时,我发现了 BadPadding: Encryption Error。到目前
比特币是一种匿名的加密数字货币。几个月前我有了加密文件的想法,其中需要比特币的支出证明才能解密文件。当比特币被发送到给定地址时,它会显示在分布在对等网络中的块文件中。区块链的完整性是通过需要大量计算机
我有一个类,我试图用依赖注入(inject)替换 Crypt::encrypt 的外观用法: encrypter= $encrypter; }
我想使用带有 RSA 算法的 OpenSSL 使用私钥加密文件: openssl rsautl -in txt.txt -out txt2.txt -inkey private.pem -encryp
我在 TCL 中使用 DES 来加密一些短语,我想将这些加密的短语存储在一些我需要轻松操作的 ascii 文件中。因此,我希望“加密短语”仅由标准 ascii 字符构成(最好没有空格)。 我正在使用类
我在 TCL 中使用 DES 来加密一些短语,我想将这些加密的短语存储在一些我需要轻松操作的 ascii 文件中。因此,我希望“加密短语”仅由标准 ascii 字符构成(最好没有空格)。 我正在使用类
我对Android平台不同的数据存储加密机制有点困惑。据我了解: 全盘加密影响整个/data 磁盘并且只能是由用户激活/停用。 ( https://source.android.com/securit
我正在使用 Lumberjack 作为日志记录平台(Objective C/Swift)有没有办法将日志加密写入文件? 如果是,那么任何例子都是有用的 另外,之后如何读取加密后的日志 密集型日志记录是
我确定这是一个典型的场景,但我找不到合适的步骤顺序。 我有一个运行 Apache 的 www.example.com 服务器(比如)1.1.1.1。我正在使用 Caddy 在 2.2.2.2 上构建一
我是一名优秀的程序员,十分优秀!