Log 4 cpp:RC4加密 cpp算法(rc4 encryption)

关于Log 4 cpp的问题,在rc4 encryption中经常遇到, 我正在写一个程序,可以使用密码 RC4 加密文件,在我的文件“test.txt”是一个词“Plaintext”,程序应该加密并保存在一个文件中(测试我使用“cout”)

我正在写一个程序,可以使用密码 RC4 加密文件,在我的文件“test.txt”是一个词“Plaintext”,程序应该加密并保存在一个文件中(测试我使用“cout”)

我觉得代码的最后一部分有问题

while ( plik.read(&x,1) )
{
  i = ( i + 1 ) % 256;
  j = ( j + S [ i ] ) % 256;
  swap( S [ i ], S [ j ] );
  temp = S [ ( S [ i ] + S [ j ] ) % 256 ] ^ x;
  cout << temp;
} 

没有错误,没有警告,我应该改变什么?

#include <algorithm>
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
int main()
{
 
 unsigned char S[256];
 int i = 0;
 for ( i = 0; i < 256; i++ )
   S [ i ] = i;
 string Key;
 cout << "Enter the key: ";
 cin >> Key;
int j = 0;
 for ( i = 0; i < 256; i++ )
 {
   j = ( j + S [ i ] + Key.at( i % Key.length() ) ) % 256;
   swap( S [ i ], S [ j ] );
 }
 ifstream plik; 
 string path = "tekst.txt";
 plik.open( path );
 char tekst;
 plik >> tekst;
 string printFile = "Encryption_" + path;
 ofstream outfile( printFile );
 
 char x;
 j = 0;
 i = 0;
 string temp;
 while ( plik.read(&x,1) )
 {
   i = ( i + 1 ) % 256;
   j = ( j + S [ i ] ) % 256;
   swap( S [ i ], S [ j ] );
   temp = S [ ( S [ i ] + S [ j ] ) % 256 ] ^ x;
   cout << temp;
 }
 
 plik.close();
 outfile.close();
 
 return 0;
}

我的关键是:“关键”,结果应该是

Good Result

My bad result

1

你的算法在数学上是完全正确的,我只是对你的代码的其他部分做了一些小的更正,你的代码做出了正确的输出。

出于测试目的,让我们以测试示例here from Wiki为例,第一个示例。输入键将是Key,输入文件将是Plaintext,生成的文件应该是十六进制的BB F3 16 E8 D9 40 AF 0A D3。以下修改后的代码通过了此测试。

在的代码中,您从控制台输入一个键,然后从tekst.txt获取输入文件,并将输出文件写入Encryption_tekst.txt。最好不要将结果作为 ASCII 字符打印到控制台,而是在十六进制查看器中查看结果文件,因为控制台会弄乱字符编码,最好以十六进制查看。

我在控制台添加了打印结果十六进制字符。另外注意在的代码中,第一个块将Plaintext写入tekst.txt,我这样做是为了示例的目的,以便代码可以复制粘贴并运行,而没有任何额外的依赖关系。您必须删除写入teks.txt的第一个块,因为您有自己的输入

运行以下示例时,在控制台提示符下输入Key

Try it online!
#include <algorithm>
#include <fstream>
#include <iostream>
#include <iomanip>
#include <string>
#include <cstdint>
using namespace std;
int main() {
    {
        ofstream out("tekst.txt");
        out << "Plaintext";
    }
    unsigned char S[256];
    int i = 0;
    for (i = 0; i < 256; i++)
        S[i] = i;
    string Key;
    cout << "Enter the key: ";
    cin >> Key;
    int j = 0;
    for (i = 0; i < 256; i++) {
        j = (j + S[i] + Key.at(i % Key.length())) % 256;
        swap(S[i], S[j]);
    }
    ifstream plik;
    string path = "tekst.txt";
    plik.open(path);
    string printFile = "Encryption_" + path;
    ofstream outfile(printFile);
    char x;
    j = 0;
    i = 0;
    char temp = 0;
    while (plik.read(&x, 1)) {
        i = (i + 1) % 256;
        j = (j + S[i]) % 256;
        swap(S[i], S[j]);
        temp = S[(S[i] + S[j]) % 256] ^ x;
        outfile << temp;
        cout << std::hex << std::setw(2) << std::setfill('0')
             << uint32_t(uint8_t(temp)) << " ";
    }
    plik.close();
    outfile.close();
    return 0;
}

输入键 (从控制台):

Key

输入文件tekst.txt

Plaintext

控制台输出:

Enter the key: Key
bb f3 16 e8 d9 40 af 0a d3

在带有代码页CP1252的十六进制查看器中查看的输出Encryption_tekst.txt

enter image description here

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(911)
Ch元素:警告:AndroidTargetSDK更新到31.0.0后 意外元素(uri:“”local:“base-extens
上一篇
Chinese猛攻打桩男同:减去同表的值(table subtraction)
下一篇

相关推荐

  • cvt和自动挡哪个好提升驾驶体验的最佳选择

    CVT(可变转换器)是一种由传动带及传动轮组成的无级变速器,它可以在没有传动档位的情况下,根据驾驶者的驾驶习惯,自动调整传动轮之间的转速比,从而实现无级变速。自动挡是指车辆自动变速箱,它使用液力传动来实现变速,可以自动适应车辆的行驶状态,减少司机的疲劳,提高行车的舒适性。…

    2023-06-08 07:42:19
    0 98 84
  • cv一叶扁舟和清影轩阳:漫游在一叶扁舟和清影轩阳之间

    cv一叶扁舟是一款开源的计算机视觉库,用于图像处理、计算机视觉等。它提供了丰富的API,可以帮助开发者快速实现各种图像处理任务,如图像分割、目标检测、图像识别等。清影轩阳是一款开源的计算机视觉框架,用于图像处理、目标检测、分类等。它提供了丰富的API,可以帮助开发者快速实现各种图像处理任务,如图像分割、目标检测、图像识别等。…

    2023-08-05 07:06:20
    0 75 13
  • css设置滚动条宽度设置:This is a title

    CSS设置滚动条宽度的方法:使用CSS3的。-webkit-属性:…

    2023-06-06 10:53:01
    0 89 32
  • xl和xe汽车cvt:探索XL和XE汽车的CVT技术优势

    XL和XE汽车CVT是一种变速器,它使用液力变矩器代替传统的机械变速器,以达到更高的效率。它的工作原理是,当发动机输出功率时,液力变矩器就会将这些功率转换为液压能量,然后将能量传递到变速器的输出轴上,从而实现变速。…

    2023-04-09 00:41:04
    0 18 29
  • cordon bleu是什么意思:法式炸鸡卷——Cordon Bleu的经典之作

    Cordon Bleu是一种烹饪技术,其中肉片被置于奶酪和火腿之间,然后用面包屑裹上,最后煎炸或烤熟。这种技术通常用于制作鸡肉,但也可以用于制作其他类型的肉类,如牛肉或猪肉。…

    2024-01-27 15:13:30
    0 80 16
  • countif 非空:非空单元格的计数

    Countif 非空是指计算某个单元格不为空的数量。代码如下:…

    2023-04-22 15:54:15
    0 98 29
  • java double保留一位小数:How to Round a Double to One Decimal Place in

    示例示例使用类可以轻松实现java double保留一位小数的功能,具体代码如下:// 创建对象…

    2023-05-14 07:40:03
    0 79 42
  • linux如何写c语言一个完整的指南

    示例示例在Linux系统中,可以使用C语言编写源代码文件,然后使用GCC编译器来编译源代码文件,生成可执行文件。下面是一个简单的C语言代码示例:…

    2023-05-16 02:02:45
    0 90 59

发表评论

登录 后才能评论

评论列表(48条)