安全密码的c语言程序,c++ 确定性地生成密码安全密钥和IVEC

背景

我正在设计一个能够为静态Web内容的用户开发动态认证方案的系统.动机是预先生成大量复杂生成但敏感的网页内容,然后以基于cookie(嵌入可逆加密信息)身份验证的方式静态提供服务,由网络服务器强制执行.使用AEAD模式加密原语.

问题

我需要生成一个持续时间有效的IVEC和密钥,比如说一周(当前有效对).而过去的IVECs / Keys也适用于说2周(历史上有效的),并且用历史上有效的秘密加密的任何数据将仅用当前有效的IVEC / KEY重新加密.

我需要的是一个确定性的CSPRNG,它是一个随机数和密码短语的种子,可以以索引的方式产生64位或128位的数字块.如果我使用一个星期,因为 – “1 1970年”作为我的假设CSPRNG的索引元素之一,我应该能够建立一个系统,随着时间的推移自动更改密钥.

我考虑的方法

现在我没有在cryptopp中看到这样的功能,或者我现在知道的术语足够好,而且cryptopp是最先进的加密库,我不会放心,我会找到另外一个.所以,如果我找不到一个实现,我应该自己滚动.会从连接的数据中生成一个静态字符串结构,然后散列它(如下所示)做的伎俩?

RIPEMD160(RandomPreGeneratedFixedNonce:密码短语:UInt64SinceEpoch:128BitBlockIndexNumber);

注意:块分配将被分配并具有规则的结构,因此例如对于128位摘要,块0的前64位将用于ivec,所有元素1用于128位密钥.

这是一个健全的方法( – ,即密码安全)?

– 编辑:帖子接受评论 –

经过反思之后,我决定将我最初认为的密码和nonce / salt合并成一个16字节(cryptographicall strong)密钥,并使用PKCS#5中概述的技术来导出多个基于时间的密钥.不需要盐,因为没有使用密码.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 C 语言中实现图形化界面的 DES 算法,可以使用 Qt 库来设计界面。以下是一个简单的示例程序,可以实现 DES 算法的加密和解密,并在图形化界面上显示输入和输出: ```c++ #include <QtWidgets/QApplication> #include <QtWidgets/QWidget> #include <QtWidgets/QLabel> #include <QtWidgets/QLineEdit> #include <QtWidgets/QPushButton> #include <QtWidgets/QVBoxLayout> #include <QtWidgets/QHBoxLayout> #include <QMessageBox> #include <QByteArray> #include <QDebug> #include <openssl/des.h> class DesWidget : public QWidget { Q_OBJECT public: DesWidget(QWidget *parent = nullptr) : QWidget(parent) { // 明文输入框 m_plainText = new QLineEdit(); m_plainText->setPlaceholderText(QStringLiteral("请输入明文")); // 密钥输入框 m_key = new QLineEdit(); m_key->setPlaceholderText(QStringLiteral("请输入密钥")); // 加密按钮 m_encryptBtn = new QPushButton(QStringLiteral("加密")); connect(m_encryptBtn, &QPushButton::clicked, this, &DesWidget::encrypt); // 解密按钮 m_decryptBtn = new QPushButton(QStringLiteral("解密")); connect(m_decryptBtn, &QPushButton::clicked, this, &DesWidget::decrypt); // 密文显示框 m_cipherText = new QLabel(); m_cipherText->setText(QStringLiteral("密文: ")); // 明文显示框 m_plainText2 = new QLabel(); m_plainText2->setText(QStringLiteral("明文: ")); // 布局 QVBoxLayout *mainLayout = new QVBoxLayout(); QHBoxLayout *inputLayout = new QHBoxLayout(); QVBoxLayout *outputLayout = new QVBoxLayout(); inputLayout->addWidget(m_plainText); inputLayout->addWidget(m_key); inputLayout->addWidget(m_encryptBtn); inputLayout->addWidget(m_decryptBtn); outputLayout->addWidget(m_cipherText); outputLayout->addWidget(m_plainText2); mainLayout->addLayout(inputLayout); mainLayout->addLayout(outputLayout); setLayout(mainLayout); } private: void encrypt() { // 获取明文和密钥 QString plainText = m_plainText->text(); QString key = m_key->text(); // 检查明文和密钥是否为空 if (plainText.isEmpty() || key.isEmpty()) { QMessageBox::warning(this, QStringLiteral("警告"), QStringLiteral("请输入明文和密钥")); return; } // 将明文和密钥转换为字节数组 QByteArray plainBytes = plainText.toUtf8(); QByteArray keyBytes = key.toUtf8(); // 检查密钥长度是否符合要求 if (keyBytes.size() != 8) { QMessageBox::warning(this, QStringLiteral("警告"), QStringLiteral("密钥长度必须为 8 位")); return; } // 初始化 DES 上下文 DES_cblock keyDes; memcpy(keyDes, keyBytes.constData(), 8); DES_key_schedule keySchedule; DES_set_key_checked(&keyDes, &keySchedule); // 加密明文 QByteArray cipherBytes; int plainSize = plainBytes.size(); int cipherSize = ((plainSize + 7) / 8) * 8; cipherBytes.resize(cipherSize); DES_cblock ivec; memset(ivec, 0, sizeof(ivec)); DES_ncbc_encrypt((const unsigned char*)plainBytes.constData(), (unsigned char*)cipherBytes.data(), plainSize, &keySchedule, &ivec, DES_ENCRYPT); // 将密文显示在界面上 m_cipherText->setText(QStringLiteral("密文: ") + QString(cipherBytes.toHex())); // 清空明文输入框 m_plainText->clear(); } void decrypt() { // 获取密文和密钥 QString cipherText = m_cipherText->text(); QString key = m_key->text(); // 检查密文和密钥是否为空 if (cipherText.isEmpty() || key.isEmpty()) { QMessageBox::warning(this, QStringLiteral("警告"), QStringLiteral("请输入密文和密钥")); return; } // 将密文和密钥转换为字节数组 QByteArray cipherBytes = QByteArray::fromHex(cipherText.toUtf8()); QByteArray keyBytes = key.toUtf8(); // 检查密钥长度是否符合要求 if (keyBytes.size() != 8) { QMessageBox::warning(this, QStringLiteral("警告"), QStringLiteral("密钥长度必须为 8 位")); return; } // 初始化 DES 上下文 DES_cblock keyDes; memcpy(keyDes, keyBytes.constData(), 8); DES_key_schedule keySchedule; DES_set_key_checked(&keyDes, &keySchedule); // 解密密文 QByteArray plainBytes; int cipherSize = cipherBytes.size(); int plainSize = ((cipherSize + 7) / 8) * 8; plainBytes.resize(plainSize); DES_cblock ivec; memset(ivec, 0, sizeof(ivec)); DES_ncbc_encrypt((const unsigned char*)cipherBytes.constData(), (unsigned char*)plainBytes.data(), cipherSize, &keySchedule, &ivec, DES_DECRYPT); // 将明文显示在界面上 m_plainText2->setText(QStringLiteral("明文: ") + QString(plainBytes)); // 清空密文输入框 m_cipherText->clear(); } private: QLineEdit *m_plainText; // 明文输入框 QLineEdit *m_key; // 密钥输入框 QPushButton *m_encryptBtn; // 加密按钮 QPushButton *m_decryptBtn; // 解密按钮 QLabel *m_cipherText; // 密文显示框 QLabel *m_plainText2; // 明文显示框 }; int main(int argc, char *argv[]) { QApplication app(argc, argv); DesWidget desWidget; desWidget.show(); return app.exec(); } #include "main.moc" ``` 在上述代码中,我们使用了 OpenSSL 库中的 DES 功能来实现加密和解密,并使用 Qt 库来设计图形化界面。界面中包含了明文输入框、密钥输入框、加密按钮、解密按钮、密文显示框和明文显示框。用户输入明文和密钥后,点击加密按钮可以对明文进行加密,并将密文显示在界面上;用户输入密文和密钥后,点击解密按钮可以对密文进行解密,并将明文显示在界面上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值