當前位置:首頁 » 編程語言 » c語言des

c語言des

發布時間: 2025-09-18 13:10:39

❶ des解密演算法,利用c語言解密JAVA語言加密的密碼。。密鑰為12345678,加密後的密文為:26d086be3a3a62fc

// C 語言 DES用的是 ECB模式, 沒有填充
// 因此Java端要對應, 你的明文是 liubiao 嗎?
// 另外 DES已經不安全了, 如果可以改為 3DES或者 AES吧。
public class LearnDes {

public static void main(String[] args) {
try {
System.out.println(encrypt("liubiao", "12345678"));

System.out.println(decrypt("26d086be3a3a62fc", "12345678"));
} catch (Exception e) {
e.printStackTrace();
}
}
public static String encrypt(String message, String key) throws Exception {
//Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
Cipher cipher = Cipher.getInstance("DES/ECB/NOPADDING");

DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));

SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8"));
//cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
cipher.init(Cipher.ENCRYPT_MODE, secretKey );

return toHexString(cipher.doFinal(message.getBytes("UTF-8")));
}

public static String decrypt(String message, String key) throws Exception {

byte[] bytesrc = convertHexString(message);

//Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
Cipher cipher = Cipher.getInstance("DES/ECB/NOPADDING");
DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8"));

//cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
cipher.init(Cipher.DECRYPT_MODE, secretKey );

byte[] retByte = cipher.doFinal(bytesrc);
return new String(retByte);
}

public static byte[] convertHexString(String ss) {
byte digest[] = new byte[ss.length() / 2];
for (int i = 0; i < digest.length; i++) {
String byteString = ss.substring(2 * i, 2 * i + 2);
int byteValue = Integer.parseInt(byteString, 16);
digest[i] = (byte) byteValue;
}

return digest;
}
public static String toHexString(byte b[]) {
StringBuffer hexString = new StringBuffer();
for (int i = 0; i < b.length; i++) {
String plainText = Integer.toHexString(0xff & b[i]);
if (plainText.length() < 2)
plainText = "0" + plainText;
hexString.append(plainText);
}

return hexString.toString();
}
}

❷ 求C語言迷宮程序的解釋說明!!!

我看了一下,演算法應該是一樣的,下面是我以前用C++寫的
相信你能看得懂

/////////////////////////
/////////迷宮求解////////
//////作者:hacker/////
/////時間:11.10.2006/////
/////////////////////////
/*class:
Matrix:矩陣類
offsets:搜索偏移
enum directions:四個方向
struct item:搜索節點
Migong:迷宮類
1.創建一個Migong對象
2.使用用Create方法輸入數據
3.使用Solve方法進行求解
4.ShowSolve方法顯示解
5.可以重復使用Create方法
6.入口只能在左上角
7.默認出口在右下角
ShowAllPath:窮舉所有的路徑
備注:
由於演算法原因,這里的所有路徑應該是指
介於:
a.如果兩條路存在某個點不同那麼就是不同的路
b.如果在一條路中去掉一個或者一個以上的圈,那麼他們是同一條路
之間意義上的路
*/
#include <iostream>
#include <stack>
#include <vector>

using namespace std;

#ifndef MIGONG_H
#define MIGONG_H
///////////////////
///////矩陣類//////
///////////////////
class Matrix{
int* m;
int row, col;
bool iscreate;
public:
Matrix(){m=0;iscreate=false;};
~Matrix() {Release();};
bool Create(int, int);
int& operator () (int, int);
int GetRow(){return row;};
int GetCol(){return col;};
void Release();
void Show(char, char );
};

bool Matrix::Create(int r, int c)
{
if( r<=0 || c<=0) return false;

Release();

row = r;
col = c;
m = new int[row*col];

for (int i=0;i<row*col;i++)
{
*(m+i) = 0;
}
iscreate = true;
return true;
}

int& Matrix::operator ()(int r, int c)
{
return *(m+r*col+c);
}

void Matrix::Release()
{
if (iscreate)
{
row = col = 0;
if (m) delete[] m;
m = 0;
}
iscreate = false;
}

void Matrix::Show(char blk='#', char nblk=' ')
{
int i, j;
for (i=0;i<row;i++)
{
for (j=0;j<col;j++)
{
if (*(m+i*col+j) == 0)
cout<<nblk;
else
cout<<blk;
}
cout<<endl;
}
}
/////////////////////////////
////迷宮相關數據結構的定義///
/////////////////////////////
struct offsets{
int a, b;
};

enum directions{
_S = 0,
_E,
_N,
_W
};

struct item{
int row, col, dir;
};

class Migong{
static offsets move[4];
Matrix maze;
Matrix mark;
int row;
int col;
int desr;
int desc;
stack<item> stk;
bool iscreate;
int pathlength;
bool GetPath();
bool IsInPath(int, int);
public:
Migong(){issolved=false;result=0;pathlength=row=col=0;iscreate=false;};
~Migong(){Release();};
bool Create(int* , int , int , int , int );
void Solve();
void Release();
void OutputMaze();
void ShowSolve(char, char );
public:
bool issolved;
item* result;
};

offsets Migong::move[4]={ {1, 0}, {0, 1},
{-1, 0}, {0, -1}};

////////////////////////////
//迷宮數據應該是不含邊框的//
////////////////////////////
bool Migong::Create(int* m, int r, int c, int desrow=-1, int descol=-1)
{
if (r<=0 || c<=0) return false;

Release();

if (desrow==-1 || descol==-1)
{
desr = r;
desc = c;
}
else
{
desr = desrow;
desc = descol;
}

row = r;
col = c;
maze.Create(r+2, c+2);
mark.Create(r+2, c+2);

int i, j;

for (i=0;i<r+2;i++)
{
for (j=0;j<c+2;j++)
{
if (j==0 || j==c+1 || i==0 || i==r+1)
{
mark(i, j) = maze(i, j) = 1;

}else
{
mark(i, j) = 0;
maze(i, j) = m[((i-1)*col+j-1)];
}
}
}
return iscreate = true;
}

bool Migong::GetPath()
{
mark(1,1) = 1;
item temp;
temp.col = 1;
temp.row = 1;
temp.dir = _S;
stk.push(temp);

while (!stk.empty())
{
temp = stk.top();
stk.pop();

int i = temp.row;
int j = temp.col;
int d = temp.dir;

while (d<4)
{//根據當前點的狀態確定下一個搜索點
int g = i + move[d].a;
int h = j + move[d].b;

if (g==desr && h==desc)
{
return true;
}
//如果這個點不是障礙點且沒有被搜索過那麼可以對這個點進行搜索
if (maze(g, h)==0 && mark(g, h)==0)
{
mark(g, h) = 1;
temp.row = g;
temp.col = h;
temp.dir = d+1;
stk.push(temp);
i = g;
j = h;
d = _S;//對一下個點進行搜索
}
else d++;
}
}
return false;
}

void Migong::Solve()
{
issolved = GetPath();
if (issolved)
{
pathlength = stk.size();
result = new item[pathlength];
for (int i=0;i<pathlength;i++)
{
*(result+i) = stk.top();
stk.pop();
// cout<<"("<<(*(result+i)).row<<","<<(*(result+i)).col<<")"<<endl;
}
}
while (!stk.empty())
stk.pop();
}

void Migong::Release()
{
if (iscreate)
{
maze.Release();
mark.Release();
row=col=0;
if (result)
delete [] result;
result = 0;
while (!stk.empty())
stk.pop();
}
iscreate = false;
issolved = false;
pathlength = 0;
}

void Migong::OutputMaze()
{
if (!iscreate) return;
maze.Show();
}

bool Migong::IsInPath(int r, int c)
{
if (!iscreate || !issolved)
return false;

item temp;
for (int i=0;i<pathlength;i++)
{
temp = *(result+i);
if ((temp.row==r) && (temp.col==c))
return true;
}

return false;
}

void Migong::ShowSolve(char blk='#',char s='o')
{
if (!iscreate) return;
if (!issolved)
{
cout<<"無解"<<endl;
}
else
{
int i, j;
for (i=0;i<row+2;i++)
{
for (j=0;j<col+2;j++)
{
if ((i==1 && j==1) || (i==desr && j==desc))
{
cout<<s;
}
else if (maze(i, j) == 1)
{
cout<<blk;
}else
{
if (IsInPath(i, j))
cout<<s;
else
cout<<' ';
}
}
cout<<endl;
}
}
}

//////////////////////
//////窮舉所有路徑////
//////////////////////
offsets move[4]={ {1, 0}, {0, 1},
{-1, 0}, {0, -1}};

struct node
{
int row,col;
};

vector<node> path;
int count;
bool IsReachable( Matrix& maze, Matrix& mark, node beg, node des)
{
if (beg.row==des.row&&beg.col==des.col)
{//如果達到的話那麼顯示路徑
count++;
cout<<"第"<<count<<"條路徑:"<<endl;
for (int i=0;i<path.size();i++)
cout<<"("<<path[i].row<<","<<path[i].col<<")";
cout<<"("<<des.row<<","<<des.col<<")";
cout<<endl;
return false;
}
if (maze(beg.row, beg.col)==1 || mark(beg.row, beg.col)==1)
{
return false;
}

path.push_back(beg);
mark(beg.row, beg.col) = 1;

node nextnode;

for (int i=_S;i<_W+1;i++)
{
nextnode.row = beg.row + move[i].a;
nextnode.col = beg.col + move[i].b;

IsReachable(maze, mark, nextnode, des);
}

path.resize(path.size()-1);
mark(beg.row, beg.col) = 0;

return false;//如果不是窮舉的話應該根據for循環的結果重新設置返回值
}

/*
參數maze,mark為迷宮長寬均加二的矩陣
desr,desc為出口點
*/
void FindAllPath( Matrix& maze, Matrix& mark, int desr, int desc)
{
node first, last;
first.row = 1;
first.col = 1;
last.row = desr;
last.col = desc;

IsReachable(maze, mark, first, last);

path.clear();
}

/*
m迷宮矩陣數據
r,c行和列的大小
desr,desc目標位置
*/
void ShowAllPath(int* m, int r, int c, int desr=-1, int desc=-1)
{
Matrix maze, mark;
maze.Create(r+2, c+2);
mark.Create(r+2, c+2);

if (desr==-1 || desc==-1)
{
desr = r;
desc = c;
}

int i, j;

for (i=0;i<r+2;i++)
{
for (j=0;j<c+2;j++)
{
if (j==0 || j==c+1 || i==0 || i==r+1)
{
mark(i, j) = maze(i, j) = 1;

}else{
mark(i, j) = 0;
maze(i, j) = m[((i-1)*c+j-1)];
}
}
}

count = 0;
FindAllPath(maze, mark, desr, desc);

maze.Release();
mark.Release();
}
#endif

❸ C語言中handle類型是什麼意思

1、handle是句柄類型,來源於Handle-C,Handle-C是硬體描述語言。windows在創建一個系統對象的同時,把一個句柄賦值給這個實體 ,可以用這個句柄來識別或者修改這個對象, 這就是handle句柄的作用。

2、句柄(HANDLE)是資源的標識。操作系統要管理和操作這些資源,都是通過句柄來找到對應的資源。按資源的類型,又可將句柄細分成圖標句柄(HICON),游標句柄(HCURSOR),窗口句柄(HWND),應用程序實例句柄(HINSTANCE)等等各種類型的句柄。 所以HWND是一種HANDLE

❹ 求一個用c語言寫的DES加密演算法~~

using system;
using system.security.cryptography;
using system.io;
using system.text;

public class encryptstringdes {

public static void main(string);
return;
}

// 使用utf8函數加密輸入參數
utf8encoding utf8encoding = new utf8encoding();
byte.tochararray());

// 方式一:調用默認的des實現方法des_csp.
des des = des.create();
// 方式二:直接使用des_csp()實現des的實體
//des_csp des = new des_csp();

// 初始化des加密的密鑰和一個隨機的、8比特的初始化向量(iv)
byte iv = {0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef};
des.key = key;
des.iv = iv;

// 建立加密流
symmetricstreamencryptor sse = des.createencryptor();

// 使用cryptomemorystream方法獲取加密過程的輸出
cryptomemorystream cms = new cryptomemorystream();

// 將symmetricstreamencryptor流中的加密數據輸出到cryptomemorystream中
sse.setsink(cms);

// 加密完畢,將結果輸出到控制台
sse.write(inputbytearray);
sse.closestream();

// 獲取加密數據
byte);
}
console.writeline();

//上面演示了如何進行加密,下面演示如何進行解密
symmetricstreamdecryptor ssd = des.createdecryptor();
cms = new cryptomemorystream();
ssd.setsink(cms);
ssd.write(encrypteddata);
ssd.closestream();

byte decryptedchararray = utf8encoding.getchars(decrypteddata);
console.writeline("解密後數據:");
console.write(decryptedchararray);
console.writeline();
}
}

編譯

d:\csharp>csc des_demo.cs
microsoft (r) c# compiler version 7.00.8905
right (c) microsoft corp 2000. all rights reserved.

運行實例:
d:\csharp>des_demo.exe 使用c#編寫des加密程序的framework

加密結果:
3d 22 64 c6 57 d1 c4 c3 cf 77 ce 2f d0 e1 78 2a 4d ed 7a a8 83 f9 0e 14 e1 ba 38
7b 06 41 8d b5 e9 3f 00 0d c3 28 d1 f9 6d 17 4b 6e a7 41 68 40

❺ c語言,怎麼知道某一個數據在txt的第幾個位元組

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
unsigned long file_size;
char *text_buf;
FILE *fp;

fp = fopen("aa.txt","r");//這里把aa.txt改成你要打開的文件名字
fseek(fp,0,SEEK_END);
file_size = ftell(fp);
rewind(fp);
text_buf = (char *)malloc(file_size+1);
memset(text_buf,'',file_size+1);
fread(text_buf,file_size,1,fp);
char *str = "a";//這個"a"字元就是你要查找的字元
char *des;
des = strstr(text_buf,str);
int result;
result = des-text_buf+1;
printf("你查找的文字在txt的第%d位置 ",result);
}

❻ c語言編程 游戲開始之前的界面 點擊play 開始游戲

【教程】c語言怎麼編游戲

純真童趣的《泡泡堂》,還有武林情仇,笑傲江湖的《劍俠情緣on

line》.它是e時代常談的話題,是互動式娛樂的主力軍,是一種

高層次的綜合藝術,更是一個民族的文化,世界觀的全新傳播方式

.作為游戲玩家的我們,是不是想設計一個屬於自己的游戲呢?

愛玩是人的天性,而C語言是我們計算機專業都要學習的一門基礎

學科.一般來說,是比較枯燥的.那麼,我們能不能通過編一些小

游戲來提高它的趣味性呢?這樣學習程序設計,就不會是一件艱苦

,枯燥的事,它變得象電腦游戲一樣充滿好奇,富有樂趣.這正是

我發貼的目的.

1, 總是從Hello,world開始

學習編程的第一個程序,一般就是列印一個親切的詞語——"Hell

o,world!".讓我們來看看這個最簡單的C程序:

#incolude <stdio.h> /*把輸入輸出函數的頭文尺鋒件包含進來*/

int main()

{

printf("Hello,

world!");/*在屏幕上輸出字元串"Hello,world!"*/

return 0;/*退出main函數,並返回0*/

}

下面我們發現幾個值得改進的地方,1,程序的運行結果一閃而過

.2,每執行這個程序一次都能看見上次運行留下的字元.3,我們

還希望屏幕輸出一個笑臉來歡迎我們.(大家不要小看了這個笑臉

曾經有人發貼專門問呢)讓我們來改進一下這個程序吧!

1,在return語句的前面加一句:getch ();,表示按任意鍵結

束.2,在printf語句前用clrscr函數清屏,要使用這個函數和get

ch函數,需要在程序開頭再包含頭文件conio.h.3,ASCII碼也有

許多非常好玩的字元,比如ASCII碼值為2的就是一個笑臉,我們可

以用printf("%c", 2)來輸出一個笑臉.

現在我們把Hello,world程序改成一個更好看的Hello,world了.下

面讓我們開始做游戲吧!

2, 心動的開始,一個運動中的笑臉

大家小時侯喜歡看動畫片嗎?哈哈,我猜你們都喜歡吧!下面就讓

我們來做一個小動畫吧.在屏幕上顯示一個運動的小笑臉,而且當

它到達屏幕的邊緣時會自動彈回來.

先在程序定義一個在屏幕中運動的點的結構:

struct move_point

{

int x, y;/*該點的位置,包括x坐標和y坐標*/

int xv, yv;/*該點在x軸,y軸的速度*/

};

運塵困鋒動的原理是,先擦去物體先前的軌跡,讓物體按其速度移動一段

距離,再畫出該物體.讓我們看到以下代碼:

gotoxy(man.x, man.y);/*把游標移到指定的坐標*/

printf(" ");/*輸出一個空格,把先前的字元擦去*/

然後我們讓物體按其速度運動:

man.x += man.xv;/*水平方向按x軸的速度運動*/

man.y += man.yv;/*垂直方向按y軸的速度運動*/

運動後還要判斷物體是否出界,如果出了界,就令物體反彈,即讓

它下一刻的速度等於現在的速度的相反數.最後列印出這個笑臉:

gotoxy(man.x, man.y);

printf("%c\b", 2); /*輸出ASCII碼值為2的"笑臉"字元*/

怎麼樣?是不是很有趣呢?不過這個笑臉一直是自己運動,能不能

讓我們來控制它運動呢?答案是肯定的,讓我們繼續往下學吧!

3, 交互的實現——讓我們來控制笑臉運動

這個程序的主要功能是接受按鍵,如果接收的是方向鍵,就讓笑臉

順著方向移動,如果接收的是ESC鍵派晌就退出程序,其他按鍵則忽略

處理.接受按鍵我們用以下兩條語句:

while (bioskey(1) == 0);/*等待按鍵*/

key = bioskey(0);/*把接收的按鍵的鍵盤碼賦給變數key*/

然後用switch語句來判斷按鍵以及執行相關操作,如下:

switch (key) /*對變數key的值進行判斷*/

{

case UP: /*如果按的是向上鍵*/

… break; /*讓物體向上運動,並退出switch*/

case DOWN: /*如果按的是向下鍵*/

… break; /*讓物體向下運動,並退出switch*/

case LEFT: /*向左鍵*/

… break;;/*向左運動*/

case RIGHT: /*向右鍵*/

… break;/*向右運動*/

default:

break;/*其他按鍵則忽略處理*/

}

怎麼樣,是不是有了玩游戲的感覺了?不過這個程序沒有什麼目的

,也沒有什麼判斷勝負的條件.下面我們就利用這個能控制它移動

的笑臉來做一個更有趣的游戲吧!

4, 在迷宮中探索

小時侯,我常在一些小人書和雜志上看見一些迷宮的游戲,非常喜

歡玩,還常到一些書上找迷宮玩呢.好的,現在我們用C語言來編

個迷宮的游戲,重溫一下童年的樂趣.

首先,我們定義一個二維數組map,用它來保存迷宮的地圖,其中m

ap[x][y] == '#'表示在(x,y)坐標上的點是牆壁.DrawMap函數

在屏幕上輸出迷宮的地圖和一些歡迎信息.

在main函數里,我們定義了"小人"man的坐標和"目的地"des的

坐標.在游戲循環中,我們增加了一些用來判斷勝負的語句:

if (man.x == des.x && man.y == des.y) /*如果人的坐標等於目

的地的坐標*/

{

gotoxy(35, 3);

printf("Ok! You win!"); /*輸出勝利信息*/

….

}

在判斷按鍵時,如果玩家按的是方向鍵,我們還要先判斷前面是不

是有"牆壁",如果有的話,就不能往前移動了.好的,我們在判

斷按鍵的switch語句的各個分支加上了判斷語句,如下:

if (map[…][…] == '#') break;/*如果前面是牆壁,就不執行

下去*/

哇噻!真棒,我們做出了一個完整的游戲了.當然你還可以通過修

改二維數組map來修改迷宮的地圖,讓它更有挑戰性.不過,我們

要設計一個更好玩的游戲——

5, 聰明的搬運工

大家一定玩過"搬運工"的游戲吧!這是在電腦和電子字典上較流

行的益智游戲,讓我們動手做一個屬於自己的"搬運工"吧!

程序依然用數組map來保存地圖,數組元素如果為空格則表示什麼

也沒有,'b'表示箱子,'#'表示牆壁,'*'表示目的地,'i

'表示箱子在目的地.我們以後每推一下箱子,不但要改變屏幕的

顯示,也要改變map相應元素的值.

游戲的主循環依然是接受按鍵.當接收一個方向鍵,需要判斷小人

前面一格的狀態,如果是空地或目的地,則人物可以直接移動;如

果是牆壁,則不可移動;如果是箱子或目的地上的箱子,則需要繼

續判斷箱子前面一格的狀態:如果前一格是空地或目的地,則人推

箱子前進,否則不可移動.好的,我們在switch中增加了這些判斷

語句.

程序還有一個重要的功能就是判斷勝利.數組Des用來記錄全部目

的地的坐標,我們每執行一步操作後,程序就要通過Des數組判斷

這些目的地上是否都有箱子了.

真棒啊!我們可以做游戲了.而且是一個老少皆宜,趣味十足的游

戲呢!當然,我們可以通過修改map數組來製作不同的游戲地圖,

我們還可以相互分享好的游戲地圖呢.

尾聲:

在C++等高級語言還沒出來的時候,很多應用程序也是C語言開發的

.C語言在與硬體聯系緊密的編程中,也佔有重要地位.

其實我覺得學習編程,可以通過一些小游戲,實用的例子來學習.

象學習音樂的人,不是要等到把全部樂理學完後才演奏一個完整的

曲子.而是剛開始學時就有一些簡單的曲子讓你演奏,讓你立刻就

有成就感,讓你很快就能賣弄出來在別人面前表現自己了.通過編

游戲來學習編程,把學習變成游戲,不失為學習計算機的一種好方

法.

好了,編游戲就這么簡單,希望大家也嘗試用C語言或其他的語言

來做幾個自己喜歡的小游戲.

熱點內容
java返回this 發布:2025-10-20 08:28:16 瀏覽:582
製作腳本網站 發布:2025-10-20 08:17:34 瀏覽:876
python中的init方法 發布:2025-10-20 08:17:33 瀏覽:571
圖案密碼什麼意思 發布:2025-10-20 08:16:56 瀏覽:757
怎麼清理微信視頻緩存 發布:2025-10-20 08:12:37 瀏覽:673
c語言編譯器怎麼看執行過程 發布:2025-10-20 08:00:32 瀏覽:1000
郵箱如何填寫發信伺服器 發布:2025-10-20 07:45:27 瀏覽:243
shell腳本入門案例 發布:2025-10-20 07:44:45 瀏覽:103
怎麼上傳照片瀏覽上傳 發布:2025-10-20 07:44:03 瀏覽:795
python股票數據獲取 發布:2025-10-20 07:39:44 瀏覽:701