我对密码学很感兴趣,并决定尝试编写一个 AES 库。不过已经很久没有写cpp了,有点生疏了。我的 AES.cpp 文件中有此代码:
#include "AES.h"
#include <iostream>
#include <cstdint>
void initialize_aes(int Nk){
int Nr;
try {
if(Nk == 4){
Nr = 10;
} else if(Nk == 6){
Nr = 12;
} else if(Nk == 8){
Nr = 14;
} else {
throw (Nk);
}
}
catch (int a){
std::cout << "error: '" << a << "' is not an accepted value for key length";
}
};
我的 main.cpp 文件中的代码:
#include "AES.h"
#include <iostream>
#include <cstdint>
int main(){
uint8_t i[256];
initialize_aes(6);
std::cout << Nr;
}
是的,文件链接正确并且有一个 AES.h 文件。我只是没有将其包含在这篇文章中。
我想要的是能够声明并定义 Nr 变量,然后在 main.cpp 文件中调用它。我尝试过类和外部标签,但它们不起作用,我不确定我是否做对了。理想情况下,我会使用一个类,但我在将变量放入函数并让函数将该变量设置为类时遇到问题。 AES.cpp:
class AES {
public:
int Nr;
int Nk;
int Nb = 4;
};
void initialize_aes(a, int Nk){
try {
if(Nk == 4){
AES a;
AES_4.Nr = 10;
AES_4.Nk = 4;
} else if(Nk == 6){
AES a;
AES_6.Nr = 12;
AES_6.Nk = 6;
} else if(Nk == 8){
AES a;
AES_8.Nr = 14;
AES_6.Nk = 8;
} else {
throw (Nk);
}
}
catch (int a){
std::cout << "error: '" << a << "' is not an accepted value for key length";
}
};
主要.cpp:
int main(){
AES aes; //I am not sure what the best format would be to put it in the function
initialize_aes(aes, 6);
std::cout << aes.Nr;
}
我需要的是在函数内创建一个可以在任何地方调用的新类对象。我需要使用不同的返回类型吗?任何建议将不胜感激。
这是一种思考方式。 将初始化放在构造函数中,而不是使其成为一个单独的函数。
还要注意,在这样的类中将错误写入 cout 并不是一个好主意。 如果您最终在没有标准输出的 GUI 应用程序中使用它怎么办? 我在这里所做的只是设置一个稍后检测到的标志,但您当然可以抛出异常。
class AES {
public:
int Nr;
int Nk;
int Nb = 4;
bool ok;
AES( int _Nk)
: Nk( _Nk )
, ok( true )
{
if(Nk == 4){
Nr = 10;
} else if(Nk == 6){
Nr = 12;
} else if(Nk == 8){
Nr = 14;
} else {
ok = false;
}
}
};
int main(){
AES aes( 6 );
if( aes.ok )
std::cout << aes.Nr << "\n";;
}