3DES Jni
2015-07-30 11:26
295 查看
具体算法原理
http://baike.baidu.com/view/350958.htm
具体实现
3des 的输入参数需要长度24 的key 和 长度为8的iv(通常情况可以默认某个常量)
unsigned char*
tripleDes(const unsigned char *src,int src_len,const unsigned char *key,const unsigned char *iv, int*len,TRIPLE_DES_CRYPTO flag){
if (strlen((const char *)key)!=24)
{
return NULL;
}
EVP_CIPHER_CTX ctx;
EVP_CIPHER_CTX_init(&ctx);
if (iv==NULL)
{ //if iv is null will write a default 'init Vec'
unsigned char new_iv[]={'i','n','i','t','
','V','e','c'};
iv = new_iv;
}
if (flag == TRIPLE_DES_ENCRYPT) {
int err = EVP_EncryptInit_ex(&ctx, EVP_des_ede3_ecb(), NULL,
key, iv);
err = EVP_CIPHER_CTX_set_padding(&ctx, 0x0001|0x0002);
if (err<=0) {
return NULL;
}
//warning:special character may get an error!
int c_len = 0;
//calc the 3des output len 8 multiple,be careful multi 2
int c_po_len = (src_len + 8)
& ~(8 - 1);
unsigned char *cipher_t
= (unsigned char *)malloc(c_po_len
* sizeof(char));
memset((void *)cipher_t, 0x0,
c_po_len);
err = EVP_EncryptUpdate(&ctx, cipher_t, &c_len, src, src_len);
if (err<=0) {
free(cipher_t);
return NULL;
}
int f_len = 0;
err = EVP_EncryptFinal_ex(&ctx, cipher_t+c_len, &f_len);
if (err<=0) {
free(cipher_t);
return NULL;
}
EVP_CIPHER_CTX_cleanup(&ctx);
*len=c_len+f_len;
return cipher_t;
}
else if (flag == TRIPLE_DES_DECRYPT)
{
int err = EVP_DecryptInit_ex(&ctx, EVP_des_ede3_ecb(), NULL,
key, iv);
err = EVP_CIPHER_CTX_set_padding(&ctx, 0x0001|0x0002);
if (err<=0) {
return NULL;
}
//warning:special character may get an error!
int c_len = 0;
//calc the 3des output len 8 multiple
int c_po_len = (src_len + 8)
& ~(8 - 1);
unsigned char *cipher_t
= (unsigned char *)malloc(c_po_len*sizeof(char));
memset((void *)cipher_t, 0,
c_po_len);
err = EVP_DecryptUpdate(&ctx, cipher_t, &c_len, src, src_len);
if (err<=0) {
free(cipher_t);
return NULL;
}
int f_len=0;
err = EVP_DecryptFinal_ex(&ctx, cipher_t+c_len, &f_len);
if (err<=0) {
free(cipher_t);
return NULL;
}
EVP_CIPHER_CTX_cleanup(&ctx);
*len = c_len+f_len;
cipher_t[*len] = '\0';
return cipher_t;
}
EVP_CIPHER_CTX_cleanup(&ctx);
return NULL;
}
http://baike.baidu.com/view/350958.htm
具体实现
3des 的输入参数需要长度24 的key 和 长度为8的iv(通常情况可以默认某个常量)
unsigned char*
tripleDes(const unsigned char *src,int src_len,const unsigned char *key,const unsigned char *iv, int*len,TRIPLE_DES_CRYPTO flag){
if (strlen((const char *)key)!=24)
{
return NULL;
}
EVP_CIPHER_CTX ctx;
EVP_CIPHER_CTX_init(&ctx);
if (iv==NULL)
{ //if iv is null will write a default 'init Vec'
unsigned char new_iv[]={'i','n','i','t','
','V','e','c'};
iv = new_iv;
}
if (flag == TRIPLE_DES_ENCRYPT) {
int err = EVP_EncryptInit_ex(&ctx, EVP_des_ede3_ecb(), NULL,
key, iv);
err = EVP_CIPHER_CTX_set_padding(&ctx, 0x0001|0x0002);
if (err<=0) {
return NULL;
}
//warning:special character may get an error!
int c_len = 0;
//calc the 3des output len 8 multiple,be careful multi 2
int c_po_len = (src_len + 8)
& ~(8 - 1);
unsigned char *cipher_t
= (unsigned char *)malloc(c_po_len
* sizeof(char));
memset((void *)cipher_t, 0x0,
c_po_len);
err = EVP_EncryptUpdate(&ctx, cipher_t, &c_len, src, src_len);
if (err<=0) {
free(cipher_t);
return NULL;
}
int f_len = 0;
err = EVP_EncryptFinal_ex(&ctx, cipher_t+c_len, &f_len);
if (err<=0) {
free(cipher_t);
return NULL;
}
EVP_CIPHER_CTX_cleanup(&ctx);
*len=c_len+f_len;
return cipher_t;
}
else if (flag == TRIPLE_DES_DECRYPT)
{
int err = EVP_DecryptInit_ex(&ctx, EVP_des_ede3_ecb(), NULL,
key, iv);
err = EVP_CIPHER_CTX_set_padding(&ctx, 0x0001|0x0002);
if (err<=0) {
return NULL;
}
//warning:special character may get an error!
int c_len = 0;
//calc the 3des output len 8 multiple
int c_po_len = (src_len + 8)
& ~(8 - 1);
unsigned char *cipher_t
= (unsigned char *)malloc(c_po_len*sizeof(char));
memset((void *)cipher_t, 0,
c_po_len);
err = EVP_DecryptUpdate(&ctx, cipher_t, &c_len, src, src_len);
if (err<=0) {
free(cipher_t);
return NULL;
}
int f_len=0;
err = EVP_DecryptFinal_ex(&ctx, cipher_t+c_len, &f_len);
if (err<=0) {
free(cipher_t);
return NULL;
}
EVP_CIPHER_CTX_cleanup(&ctx);
*len = c_len+f_len;
cipher_t[*len] = '\0';
return cipher_t;
}
EVP_CIPHER_CTX_cleanup(&ctx);
return NULL;
}
相关文章推荐
- hdoj 5240 Exam 【模拟】
- UIView的autoresizingMask属性探究
- Linux的操作系统I2C驱动架构解说
- 【Windows编程】系列第七篇:Menubar的创建和使用
- ListView学习笔记
- RecyclerView借助ItemTouchHelper实现拖动和滑动删除功能
- android_mvp理解与代码示例
- hdu3949:XOR
- spring中bean的作用域
- uibuttton中的等价替换(方便实用)
- 设计模式——观察者模式
- RadioButton单选按钮
- fragment小结
- 使用VS2012创建ActiveX控件
- 性能测试工具:AB
- 常见CEPH操作命令
- 行为型模式-迭代器模式
- Javascript事件冒泡机制
- JAVA和C++ 交换两个变量的值的函数 区别
- redis memory(还可以吧)