3des加密c語言
⑴ C#3des加密時候需要密鑰
64位的任意密鑰,也就是8個字元
你可以傳一個 12345678,也可以傳 asdfghjk 你解密的時候也要用相應的密鑰如:12345678 解密
⑵ java 3des和c 3des加密通訊
在java中要注意幾個問題:
1、填充方式
2、加密方式, 比如:CBC
3、密碼以及密碼位元組順序
三種都一樣才可,如果差一點還能得到一樣的結果,那就不叫加密了。
⑶ c語言des加密和3des加密與Java中des加密和3des加密結果不同
java和c#的des是相同。搞出不同是你疏忽了細節,
應該貼出你那相同的明文密文樣本,不同的樣本,java和c#的實現
然後可以幫看是哪裡疏忽了...
⑷ 3des加密原理
使用3Des加密演算法前,我們需要了解一下當前主流的加密模式:單向加密和雙向加密,兩者最大的區別在於加密的密文是否具有可逆性。
單向加密:將需要加密的數據進行加密,並且密文不可進行解密,像我們常用的加密演算法MD5就屬於這種。
雙向加密:和單向加密不同的是可以通過某些方式進行加解密的操作,其中分為對稱加密和非對稱加密。
對稱加密:指數據使用者必須擁有相同的密鑰才可以進行加密解密,就像彼此約定的一串暗號,本文介紹的3Des加密就屬於這種。
非對稱加密:通過一組包含公鑰和私鑰的密碼來加密解密,用公鑰加密,私鑰解密,首推的就是RSA加密
---------------------------------------------------------------------------------------------------------------------------------------
3Des加密演算法,由於可以逆推原文,所以主要通過本地的唯一密鑰來保證數據的安全性,我這邊通過生成隨機的256位加密字元串存儲在本地,代碼讀取時將其通過md5加密成32位的字元串(由於本地有原始密鑰,不必擔心md5加密不可逆),最後以這32位加密字元串作為密鑰進行加解密的操作。
⑸ 如何用C實現3DES演算法..
3DES演算法C語言實現,有注釋! http://tech.cuit.e.cn/forum/thread-2448-1-1.html
⑹ 哪位編程高手,幫我用C++編寫一個完整的能運行的3DES加密演算法,謝謝!
/*在TC2 和 VC6下都可以順利運行。做了一個下午。一定要用我這個噢。有簡單的輸入錯誤檢測。有完整的說明和注釋*/#include<stdio.h> /*庫文件包含*/#include<string.h> /*用於字元串操作*/#include<stdlib.h> /*用於exit函數*//**************************************************************************int check(char *c)輸入參數: char *c: 輸入的字元串返回參數: 0:字元串中有不符合規定的字元 1: 字元串字元符合規定,沒有不符合規定的字元.功能: 檢查字元串中有否除了 0-9, +,-,*,/,(,),之外的其他字元, 如果有,則返回0, 表示出現錯誤。 若沒有,則返回1,表式字元串符合規定。**************************************************************************/int check(char *c){ int k=0; while(*c!='\0') { if((*c>='0' && *c<='9') || *c=='+' || *c=='-' || *c=='*' || *c=='/' || *c=='.' || *c=='(' || *c==')' ) { } else { printf("input error, there have the char not the math expression char!\n"); return 0; } if(*c=='(') k++; else if(*c==')') k--; c++; } if(k!=0) { printf("input error, there is not have correct bracket '()'!\n"); return 0; } return 1;}/**************************************************************************void move(char *f, double *s,int p) 輸入參數: char *f : 運算符數組 double *s: 數值數組 int p: 當前運算符數組位置。返回參數: 無功能: 將當前已經完成運算的運算符消去,同時將數值數組的位置調整以進行下一次運算。 傳入值p若為3 則當前符號的數組位置為3. f[3]=f[3+1].......f[len-2]=f[len-1] f[len-1]='\0'; s[i]=s[i+1].......s[len-1]=s[len] 因為數值比運算符多一個。***************************************************************************/void move(char *f, double *s,int p) { int i=0,len=strlen(f); for(i=p; i<len; i++) /*將已經運算過的符號,空出來的位置用後面的符號來填充,*/ { /*即把乘和除號的位置用後面的加和減號填充*/ f[i]=f[i+1]; s[i]=s[i+1]; } s[i]=s[i+1]; f[len-1]='\0';}/**************************************************************************double convnum(char *c)輸入參數: char *c :由數字和小數點組成的字元,用以轉換成double型的數值。返回參數: num:返回轉換好的值。功能: 將輸入的字元串先將其小數點以前的部分復制到temp[]數組中, 若有小數點,則將小數點之後的數值,也就是小數部分先進行計算,值存入num中 計算完成後,再對整數部分進行計算,值加上小數部分的值,存入num中。***************************************************************************/double convnum(char *c){ double num=0.0; double a=1.0; int i=0,p=0,len=0; char temp[100]; int tempi=0; int start=0; int f=1; /*正負符號指示器,若為1則為正數,為-1,此數為負數*/ len=strlen©; if(c[0]=='-') { start=1; f=-1; } for(i=start; i<len; i++) { if(c[i]=='.') { p=i; break; } temp[tempi++]=c[i]; /*將整數部分復制到temp[]中*/ } temp[tempi]='\0'; if(p!=0) { for(i=p+1;i<len;i++) /*將小數部分計算出來*/ { if(c[i]=='.') /*如果有多餘的小數點,則表示輸入錯誤*/ { printf("there is more that one dot '.' in number!error!\n"); exit(0); } a=a*0.1; num+=(a*(c[i]-48)); } } a=1.0; len=strlen(temp); /*計算整數部分*/ for(i=len-1;i>=0; i--) { num=num+(a*(temp[i]-48)); a*=10; } num=num*f; return num;}/**************************************************************************double good(char *c)輸入參數: char *c :即將進行運算的字元串型數學表達式。如3.5+(2*3/5)返回參數: s[0]:計算結果將放入s[0]中功能: 將輸入的字元串中的數字分別調用convnum(char *c)函數進行數值變換,再將其依 次存入doulbe s[i]中,將加減乘除運算符依次存入字元串符號數組 char f[i]中, 然後如果遇到括弧,則將括弧內的字元串存入另一字元數組中,然後用此 good(char *c) 遞歸函數進行遞歸運算。 然後根據先乘除,後加減的順序對已 存入數組的數值根 據存入字元串符號數組的運算符進行運算。結果存入s[0]中。 返回最終結果。***************************************************************************/double good(char *c) /*可遞歸函數*/{ /*取得數值字元串,並調用convnum轉換成double*/ char g[100],number[30]; /*g,保存當前的表達式串,number保存一個數的所有字元*/ char f[80]; /*保存所有的符號的堆棧*/ int fi=0; /*保存符號的位置指針*/ double s[80]; /*保存當前所有的數的一個堆棧*/ int si=0; /*保存數字位置指針*/ int k=0; /* 若k=1則表示有一對括弧*/ int num=0,i=0; /*num保存新括弧內的字元數,i 保存number里的字元位置*/ int cc=0; /*乘除符號數量*/ int jj=0; /*加減符號數量*/ while(*c!='\0')/*當p==1 和k==0時,表示已經把括弧里的內容全部復制到g[100]中了*/ { k=0; num=0; switch(*c) { case '+': /*當前字元為+-乘除時則表示*/ case '-': case '*': case'/': f[fi++]=*c; if(*c=='*' || *c=='/') cc++; else jj++; if(*(c-1)!=')') { number[i]='\0'; i=0;/*完成一個數字的復制,其位置指針i=0*/ s[si++]=convnum(number); } break; case'(': /*有括弧,則將當前括弧作用范圍內的全部字元保存,作為*/ k++; /*一個新的字元表達式進行遞歸調用good函數計算。*/ while(k>0) { c++; g[num]=*c; num++; if(*c==')') { k--; } else if(*c=='(') { k++; } } g[num-1]='\0'; num=0;/*完成一個括弧內容的復制,其位置指針num=0*/ s[si++]=good(g); break; default: number[i++]=*c; if(*(c+1)=='\0') { number[i]='\0'; s[si++]=convnum(number); } break; } c++; } f[fi]='\0'; i=0; while(cc>0) { switch(f[i]) { case '*': cc--; s[i+1]=s[i]*s[i+1]; move(f,s,i); break; case '/': cc--; s[i+1]=s[i]/(float)s[i+1]; move(f,s,i); break; default: i++; break; } } i=0; while(jj>0) { switch(f[i]) { case '+': s[i+1]=s[i]+s[i+1]; jj--; move(f,s,i); break; case '-': s[i+1]=s[i]-s[i+1]; jj--; move(f,s,i); break; default: printf("operator error!"); break; } } return s[0];}void main(){ char str[100]; double sum=0; int p=1; while(1) { printf("enter expression: enter 'exit' end of program\n"); scanf("%s",str); p=strcmp(str,"exit"); if(p==0) break; p=check(str); if(p==0) continue; sum=good(str); printf("%s=%f",str,sum); printf("\n"); } printf("good bye!\n");}例:enter expression: enter 'exit' end of program3.5+(12.3*15+8-(3/2+1))*2+(3.2*3-5)/6(輸入)3.5+(12.3*15+8-(3/2+1))*2+(3.2*3-5)/6=384.266667enter expression: enter 'exit' end of programchina(輸入)input error, there have the char not the math expression char!enter expression: enter 'exit' end of programexit(輸入)good bye!
如果你還有什麼不懂的,可以網路搜下:編程回憶錄,他們現在正在錄制這方面的教程,都是零基礎開始,由淺入深。
⑺ VS中用C#編寫一個DES(或3DES)加解密的Windows應用程序
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace ZU14
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//ZU14.DES des = new ZU14.DES();
ZU14.DES des = null;
private void btn_jiami_Click(object sender, EventArgs e)
{
textBox2.Text = des.Encrypt(textBox1.Text);
// MessageBox.Show("加密成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
}
private void btn_jiemi_Click(object sender, EventArgs e)
{
textBox3.Text = des.Decrypt(textBox2.Text);
//MessageBox.Show("解密成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
}
private void btn_wjjiami_Click(object sender, EventArgs e)
{
OpenFileDialog open = new OpenFileDialog();
open.InitialDirectory = @"d:\";
open.Filter = "文本文件(*.txt,*.doc,*.xls)|*.txt;*.doc;*.xls";
if (open.ShowDialog()== DialogResult.OK)
{
des.EncryptFile(open.FileName, open.FileName);
MessageBox.Show("加密成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
}
}
private void btn_wjjiemi_Click(object sender, EventArgs e)
{
OpenFileDialog open = new OpenFileDialog();
open.InitialDirectory = @"d:\";
open.Filter = "文本文件(*.txt,*.doc,*.xls)|*.txt;*.doc;*.xls";
if (open.ShowDialog() == DialogResult.OK)
{
des.DecryptFile(open.FileName);
MessageBox.Show("解密成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
}
}
private void button1_Click(object sender, EventArgs e)
{
zifu.setmisi1 = textBox4.Text.Trim();
zifu.setmisi2 = textBox5.Text.Trim();
des = new ZU14.DES();
}
}
}
上面的代碼是窗體的
下面是調用的兩個類的
using System;
using System.Collections.Generic;
using System.Text;
namespace ZU14
{
class zifu
{
private static string misi1;
private static string misi2;
public static string getmisi1
{
get
{
return misi1;
}
}
public static string setmisi1
{
set
{
misi1 = value;
}
}
public static string getmisi2
{
get
{
return misi2;
}
}
public static string setmisi2
{
set
{
misi2 = value;
}
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Security;
using System.Security.Cryptography;
using System.Collections;
using System.Data;
using System.Windows.Forms;
namespace ZU14
{
class DES
{
string iv =zifu.getmisi1; //"1234的yza";
string key = zifu.getmisi2;//"123在yzb";
/// <summary>
/// DES加密偏移量,必須是>=8位長的字元串
/// </summary>
public string IV
{
get { return iv; }
set { iv = value; }
}
/// <summary>
/// DES加密的私鑰,必須是8位長的字元串
/// </summary>
public string Key
{
get { return key; }
set { key = value; }
}
/// <summary>
/// 對字元串進行DES加密
/// </summary>
/// <param name="sourceString">待加密的字元串</param>
/// <returns>加密後的BASE64編碼的字元串</returns>
public string Encrypt(string sourceString)
{
byte[] btKey = Encoding.Default.GetBytes(key);
byte[] btIV = Encoding.Default.GetBytes(iv);
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
using (MemoryStream ms = new MemoryStream())
{
byte[] inData = Encoding.Default.GetBytes(sourceString);
try
{
using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(btKey, btIV), CryptoStreamMode.Write))
{
cs.Write(inData, 0, inData.Length);
cs.FlushFinalBlock();
}
return Convert.ToBase64String(ms.ToArray());
}
catch
{
throw;
}
}
}
/// <summary>
/// 對DES加密後的字元串進行解密
/// </summary>
/// <param name="encryptedString">待解密的字元串</param>
/// <returns>解密後的字元串</returns>
public string Decrypt(string encryptedString)
{
byte[] btKey = Encoding.Default.GetBytes(key);
byte[] btIV = Encoding.Default.GetBytes(iv);
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
using (MemoryStream ms = new MemoryStream())
{
byte[] inData = Convert.FromBase64String(encryptedString);
try
{
using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(btKey, btIV), CryptoStreamMode.Write))
{
cs.Write(inData, 0, inData.Length);
cs.FlushFinalBlock();
}
return Encoding.Default.GetString(ms.ToArray());
}
catch
{
throw;
}
}
}
/// <summary>
/// 對文件內容進行DES加密
/// </summary>
/// <param name="sourceFile">待加密的文件絕對路徑</param>
/// <param name="destFile">加密後的文件保存的絕對路徑</param>
public void EncryptFile(string sourceFile, string destFile)
{
if (!File.Exists(sourceFile)) throw new FileNotFoundException("指定的文件路徑不存在!", sourceFile);
byte[] btKey = Encoding.Default.GetBytes(key);
byte[] btIV = Encoding.Default.GetBytes(iv);
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
byte[] btFile = File.ReadAllBytes(sourceFile);
using (FileStream fs = new FileStream(destFile, FileMode.Create, FileAccess.Write))
{
try
{
using (CryptoStream cs = new CryptoStream(fs, des.CreateEncryptor(btKey, btIV), CryptoStreamMode.Write))
{
cs.Write(btFile, 0, btFile.Length);
cs.FlushFinalBlock();
}
}
catch
{
// throw;
}
finally
{
fs.Close();
}
}
}
/// <summary>
/// 對文件內容進行DES加密,加密後覆蓋掉原來的文件
/// </summary>
/// <param name="sourceFile">待加密的文件的絕對路徑</param>
public void EncryptFile(string sourceFile)
{
EncryptFile(sourceFile, sourceFile);
}
/// <summary>
/// 對文件內容進行DES解密
/// </summary>
/// <param name="sourceFile">待解密的文件絕對路徑</param>
/// <param name="destFile">解密後的文件保存的絕對路徑</param>
public void DecryptFile(string sourceFile, string destFile)
{
if (!File.Exists(sourceFile)) throw new FileNotFoundException("指定的文件路徑不存在!", sourceFile);
byte[] btKey = Encoding.Default.GetBytes(key);
byte[] btIV = Encoding.Default.GetBytes(iv);
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
byte[] btFile = File.ReadAllBytes(sourceFile);
using (FileStream fs = new FileStream(destFile, FileMode.Create, FileAccess.Write))
{
try
{
using (CryptoStream cs = new CryptoStream(fs, des.CreateDecryptor(btKey, btIV), CryptoStreamMode.Write))
{
cs.Write(btFile, 0, btFile.Length);
cs.FlushFinalBlock();
}
}
catch
{
// MessageBox.Show(ex.Message);
//throw;
}
finally
{
fs.Close();
}
}
}
/// <summary>
/// 對文件內容進行DES解密,加密後覆蓋掉原來的文件
/// </summary>
/// <param name="sourceFile">待解密的文件的絕對路徑</param>
public void DecryptFile(string sourceFile)
{
DecryptFile(sourceFile, sourceFile);
}
}
}
有什麼看不明白的,再聯系我,我的賬號就是我的QQ
⑻ 如何使用3des加密方式得到只含數字和字母的加密字元串(C#)
那還不容易,你加密出來的是byte[]數組啊,你把他轉換成16進制的字元串表示啊,不過一般都是把byte[]數組轉換成base64格式的字元串,但是字元串結尾可能有== 這個字元。但是C#裡面是支持base64 所以比較方便 是string OutPutBase64String = Convert.ToBase64String(sigtdata);
byte[] data = Convert.FromBase64String(InputBase64String);
⑼ 求C++高手幫我編寫一個能運行的3DES加解密演算法源程序,謝謝!
#if !defined(_CRYPT3DES_H)
#define _CRYPT3DES_H
#if !defined(ED_FLAG)
#define ED_FLAG
#define encrypt 0
#define decrypt 1
#endif
#ifndef _WINDOWS_
#include "windows.h"
#endif
//////////////////////////////////////////////////////////////////////////
/*
unsigned char key[8] = {"doks"};
unsigned char buff[8] = {"abcdef"};
C3DES des;
des.DoDES3(0,buff,key);
des.DoDES3(1,buff,key);
*/
/* 3DES Class. */
class C3DES
{
public:
BOOL DoDES3(int nWay,unsigned char* pSrc,int nSrcSize,unsigned char* pDes,unsigned char pKey[8]);
private:
BOOL DoDES3(
unsigned char EDFlag, //EDFlag是加\脫密標志,0表示加密,1表示脫密
unsigned char databuf[8], //DataBuf將被處理的明文或密文的緩沖區,並兼作輸出緩沖區
unsigned char keybuf[8] //8byte的密鑰緩沖區
);
inline void pro_key(void);
代碼太長http://www.360doc.com/content/14/0502/18/17111906_374002596.shtml
⑽ C語言實現,24位密鑰,3DES CBC模式
ca,我有一個開源庫,不過沒時間公開到網上, libdes吧