哪位大虾帮我看一下,这个ECC加密程序那里错了,加密后的数据都是乱的

taylor_fjzhtaobao 2012-09-19 04:23:09
是基于TomMath库的

*/
#include <time.h>
//#include "FlashFRAM\Flash&FRAM.h"
#include "ECC.h"


/*******************************************************************************
* Function Name : Ecc_encipher
* Description : Reads a block of data from the FLASH.
* Input : - QX : Public key X coordinate
- QY : Public key Y coordinate
* - GX : Curve G point X coordinate
* - GY : Curve G point Y coordinate
* - A :Curve parameter A
* - P :Finite field P
* Output : None
* Return : return a state
*******************************************************************************/
char Ecc_encipher(mp_int *qx,mp_int *qy, mp_int *px, mp_int *py,mp_int *a,mp_int *p, char* pchStr, \
char* penStr, uint32_t NumByte)
{
mp_int mx, my;
mp_int c1x, c1y;
mp_int c2x, c2y;
mp_int r;
mp_int tempx, tempy;
bool zero=FALSE;
int i,k,ecce,j=0,cj=0;
int Residue=0,Frequency=0;
char miweny[280];
char miwenx[280];

int enlongtemp=0;

mp_init(&mx);
mp_init(&my);
mp_init(&c1x);
mp_init(&c1y);
mp_init(&c2x);
mp_init(&c2y);
mp_init(&r);
mp_init(&tempx);
mp_init(&tempy);

GetPrime(&r, 100);

Frequency = NumByte/EN_LONG;
Residue = NumByte%EN_LONG;
enlongtemp=EN_LONG/2;

for(i=0; i<Frequency; i++)
{
// fread(miwenx,1,enlongtemp,fp);//读入字符串
// miwenx[enlongtemp]=char(255);
//
// fread(miweny,1,enlongtemp,fp);//读入字符串
// miweny[enlongtemp]=char(255);
//EN_LONG这个是字节数
for( k=0;k<enlongtemp;k++){
miwenx[k]=penStr[k+enlongtemp*j];
}
miwenx[enlongtemp]=(char)255;
j++;
for( k=0;k<enlongtemp;k++){
miweny[k]=penStr[k+j*enlongtemp];
}
miweny[enlongtemp]=(char)255;
j++;
//将char转化成mp_int型
putin(&mx, miwenx, enlongtemp+1);//文件存入
putin(&my, miweny, enlongtemp+1);//文件存入

Ecc_points_mul(&c2x,&c2y,px,py,&r,a,p);//加密
Ecc_points_mul(&tempx,&tempy,qx,qy,&r,a,p);
Two_points_add(&mx,&my,&tempx,&tempy,&c1x,&c1y,a,zero,p);

//保存密文,每次保存5个数据
chmistore(&c1x,pchStr,cj);
cj=+5;
chmistore(&c1y,pchStr,cj);
cj=+5;
chmistore(&c2x,pchStr,cj);
cj=+5;
chmistore(&c2y,pchStr,cj);
cj=+5;
}
//剩余字符处理
if ( Residue > 0)
{
if (Residue <= enlongtemp )
{
// fread(miwenx,1,Residue,fp);//读入字符串
for(ecce=0;ecce<Residue;ecce++){
miwenx[ecce]=penStr[(Frequency*EN_LONG)+ecce];
}
miwenx[Residue]=(char)255;

putin(&mx, miwenx,Residue+1);//文件存入

mp_zero(&my);
}
else
{
// fread(miwenx,1,enlongtemp,fp);//读入字符串
for(ecce=0;ecce<enlongtemp;ecce++){
miwenx[ecce]=penStr[(Frequency*EN_LONG)+ecce];
}
miwenx[enlongtemp]=(char)255;

// fread(miweny,1,Residue-enlongtemp,fp);//读入字符串
for(ecce=0;ecce<(Residue-enlongtemp);ecce++){
miweny[ecce]=penStr[(Frequency*EN_LONG+enlongtemp)+ecce];
}
miweny[Residue-enlongtemp]=(char)255;

putin(&mx, miwenx,enlongtemp+1);//文件存入

putin(&my, miweny,(Residue-enlongtemp)+1);//文件存入
}

Ecc_points_mul(&c2x,&c2y,px,py,&r,a,p);//加密
Ecc_points_mul(&tempx,&tempy,qx,qy,&r,a,p);
Two_points_add(&mx,&my,&tempx,&tempy,&c1x,&c1y,a,zero,p);

//保存密文
chmistore(&c1x,pchStr,cj);
cj=+5;
chmistore(&c1y,pchStr,cj);
cj=+5;
chmistore(&c2x,pchStr,cj);
cj=+5;
chmistore(&c2y,pchStr,cj);
cj=+5;
}
mp_clear(&mx);
mp_clear(&my);
mp_clear(&c1x);
mp_clear(&c1y);
mp_clear(&c2x);
mp_clear(&c2y);
mp_clear(&r);
mp_clear(&tempx);
mp_clear(&tempy);

return *pchStr;
}
char Ecc_decipher(mp_int *k, mp_int *a,mp_int *p, char* dbuffer, char* cbuffer, uint32_t NumByte){

int chtem;
mp_int c1x, c1y;
mp_int c2x, c2y;
mp_int tempx, tempy;
mp_int mx, my;
mp_int temp;
mp_int tempzero;
int i,j=0,jj=0;
int kk;
char stemp[BIT_LEN]={0};

bool zero=FALSE;

mp_init(&temp);
mp_init(&c1x);
mp_init(&c1y);
mp_init(&c2x);
mp_init(&c2y);
mp_init(&tempx);
mp_init(&tempy);
mp_init(&mx);
mp_init(&my);

mp_init(&tempzero);

//判断文件是否结束了
while(/*!feof(fp)*/NumByte-j>0)
{
i=0;
while(1)
{
stemp[i]=/*fgetc(fp)*/cbuffer[i+j];
if(i%4==0){
if((int)(stemp[i]&0xFF) == 255 )
goto L1;
}
i++;
}
L1: miwendraw(&c1x, stemp, i);
j=j+i;
i=0;
while(1){
stemp[i]=/*fgetc(fp)*/cbuffer[i+j];
if(i%4==0){
if((int)(stemp[i]&0xFF) == 255 ) goto L2;
}
i++;
}
L2: miwendraw(&c1y, stemp, i);
j=j+i;
i=0;
while(1){
stemp[i]=/*fgetc(fp)*/cbuffer[i+j];
if(i%4==0){
if((int)(stemp[i]&0xFF) == 255 ) goto L3;
}
i++;
}
L3: miwendraw(&c2x, stemp, i);
j=j+i;
i=0;
while(1){
stemp[i]=/*fgetc(fp)*/cbuffer[i+j];
if(i%4==0){
if((int)(stemp[i]&0xFF) == 255 ) goto L4;
}
i++;
}
L4: miwendraw(&c2y, stemp, i);
j=j+i;

// mp_zero(&tempzero);
// if(mp_cmp(&c1x, &tempzero)==0) {
// break;
// }
Ecc_points_mul(&tempx, &tempy, &c2x, &c2y, k, a, p);

mp_neg(&tempy, &temp);

Two_points_add(&c1x, &c1y, &tempx, &temp, &mx, &my, a,zero, p);

chtem=chdraw(&mx,stemp);//从ming中取出字符串

//保存解密结果
for(kk=0;kk<chtem;kk++)
{
// fprintf(fq,"%c",stemp[kk]);
dbuffer[kk+jj]=stemp[kk];
}
chtem=chdraw(&my,stemp);//从ming中取出字符串
jj=jj+kk;
//保存解密结果
for(kk=0;kk<chtem;kk++)
{
// fprintf(fq,"%c",stemp[kk]);
dbuffer[kk+jj]=stemp[kk];
}
jj=jj+kk;
}
mp_clear(&c1x);
mp_clear(&c1y);
mp_clear(&c2x);
mp_clear(&c2y);
mp_clear(&tempx);
mp_clear(&tempy);
mp_clear(&mx);
mp_clear(&my);
mp_clear(&temp);

return *dbuffer;
}
...全文
171 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
taylor_fjzhtaobao 2012-09-26
  • 打赏
  • 举报
回复
现在我调试通过了,加密和解密都对了,就速度有点慢,要优化,可是我以前都没有优化过程序,都不知道怎么优化
of123 2012-09-24
  • 打赏
  • 举报
回复

你是说密文不是可打印字符了,对吗?

就是应该这个样子。
taylor_fjzhtaobao 2012-09-19
  • 打赏
  • 举报
回复
哪位给看看呗
taylor_fjzhtaobao 2012-09-19
  • 打赏
  • 举报
回复
//实现将mp_int数a中的比特串还原为字符串并赋给字符串ch:
int chdraw(mp_int *a,char *ch)
{
int i,j;
mp_digit *temp,xx,yy;

temp=a->dp;
i=0;
yy=(mp_digit)255; //用于位与运算,取八位比特串
xx=(mp_digit)15; //用于位与运算,取四位比特串

for(j=0;j<a->used/2;j++) //以两个单元为循环,把两个单元的比特串赋给7个字符
{
i+=7;
ch[i-4]=(char)(*++temp & xx);
ch[i-3]=(char)((*temp >> (mp_digit)4) & yy);
ch[i-2]=(char)((*temp >> (mp_digit)12) & yy);
ch[i-1]=(char)((*temp-- >> (mp_digit)20) & yy);

ch[i-7]=(char)(*temp & yy);
ch[i-6]=(char)((*temp >> (mp_digit)8) & yy);
ch[i-5]=(char)((*temp >> (mp_digit)16) & yy);
ch[i-4] <<= 4;
ch[i-4]+=(char)((*temp++ >> (mp_digit)24) & xx);
temp++;
}
if(a->used%2!=0) //剩于一个单元的处理
{
ch[i++] = (char)(*temp & yy);
ch[i++] = (char)((*temp >> (mp_digit)8) & yy);
ch[i++] = (char)((*temp >> (mp_digit)16) & yy);
}
--i;
while( (int)(ch[i]&0xFF) != 255 && i>0 )
{
i--;
}
return i;

}

//把读取的字符存入mp_int型数
int putin(mp_int *a,char *ch,int chlong)
{
mp_digit *temp,yy;
int i,j,res;
if(a->alloc<chlong*2/7+2)
{
if((res=mp_grow(a,chlong*2/7+2))!=MP_OKAY)
return res;
}

a->sign=0;
mp_zero(a);
temp=a->dp;
i=0;
yy=(mp_digit)15;

if(chlong<4)
{
for(j=chlong-1;j>=0;j--)
{
*temp |= (mp_digit)(ch[j] & 255);
*temp <<= (mp_digit)CHAR_BIT;
}
*temp >>= (mp_digit)8;
a->used=1;
return MP_OKAY;
}

if(chlong<7)
{
i+=4;
*++temp |= (mp_digit)(ch[i-1] & yy);
*temp <<= (mp_digit)CHAR_BIT;
*temp |= (mp_digit)(ch[i-2] & 255);
*temp <<= (mp_digit)CHAR_BIT;
*temp |= (mp_digit)(ch[i-3] & 255);
*temp <<= (mp_digit)CHAR_BIT;
*temp-- |= (mp_digit)(ch[i-4] & 255); //存放被切分的字符的低四位

for(j=chlong-1;j>=i;j--)
{
*temp |= (mp_digit)(ch[j] & 255);
*temp <<= (mp_digit)CHAR_BIT;
}
*temp >>= (mp_digit)4;
*temp |= (mp_digit)((ch[i-1] & 255) >> 4); //存放被切分的字符的高四位

a->used=2;
return MP_OKAY;
}

//以7个字符为单元循环,把七个字符放入的mp_int 的两个单元中
for(j=0;j<chlong/7;j++)
{
i+=7;
*++temp |= (mp_digit)(ch[i-1] & 255);
*temp <<= (mp_digit)CHAR_BIT;
*temp |= (mp_digit)(ch[i-2] & 255);
*temp <<= (mp_digit)CHAR_BIT;
*temp |= (mp_digit)(ch[i-3] & 255);
*temp <<= (mp_digit)4;
*temp-- |= (mp_digit)((ch[i-4] & 255) >> 4); //存放被切分的字符的高四位

*temp |= (mp_digit)(ch[i-4] & yy); //存放被切分的字符的低四位
*temp <<= (mp_digit)CHAR_BIT;
*temp |= (mp_digit)(ch[i-5] & 255);
*temp <<= (mp_digit)CHAR_BIT;
*temp |= (mp_digit)(ch[i-6] & 255);
*temp <<= (mp_digit)CHAR_BIT;
*temp++ |= (mp_digit)(ch[i-7] & 255);

temp++;

}

if((chlong>=7)&&(chlong%7!=0)) //剩余字符的存放
{
if(chlong%7 < 4) //剩余字符少余4个时,只需一个mp_digit单元存放
{
for(j=chlong-1;j>=i;j--)
{
*temp |= (mp_digit)(ch[j] & 255);
*temp <<= (mp_digit)CHAR_BIT;
}
*temp >>= (mp_digit)8;
a->used=chlong*2/7+1;
}
else
{ //剩余字符不小于4个时,需两个mp_digit单元存放
i+=4;
*temp |= (mp_digit)(ch[i-1] & yy);
*temp <<= (mp_digit)CHAR_BIT;
*temp |= (mp_digit)(ch[i-2] & 255);
*temp <<= (mp_digit)CHAR_BIT;
*temp |= (mp_digit)(ch[i-3] & 255);
*temp <<= (mp_digit)CHAR_BIT;
*temp++ |= (mp_digit)(ch[i-4] & 255); //存放被切分的字符的低四位


for(j=chlong-1;j>=i;j--)
{
*temp |= (mp_digit)(ch[j] & 255);
*temp <<= (mp_digit)CHAR_BIT;
}
*temp >>= (mp_digit)4;
*temp |= (mp_digit)((ch[i-1] & 255) >> 4); //存放被切分的字符的高四位

a->used=chlong*2/7+2;
}
}
else
{
a->used=chlong*2/7;
}
return MP_OKAY;
}

//取密文

int miwendraw(mp_int *a,char *ch,int chlong)
{
mp_digit *temp;
int i,j,res;

if(a->alloc<chlong/4)
{
if((res=mp_grow(a,chlong/4))!=MP_OKAY)
return res;
}

a->alloc=chlong/4;
a->sign=0;
mp_zero(a);
temp=a->dp;
i=0;

for(j=0;j<chlong/4;j++)
{
i+=4;
*temp |= (mp_digit)(ch[i-4] & 255);
*temp <<= (mp_digit)CHAR_BIT;
*temp |= (mp_digit)(ch[i-3] & 255);
*temp <<= (mp_digit)CHAR_BIT;
*temp |= (mp_digit)(ch[i-2] & 255);
*temp <<= (mp_digit)CHAR_BIT;
*temp++ |= (mp_digit)(ch[i-1] & 255);
}
a->used=chlong/4;
return MP_OKAY;
}
//二进制存储密文
int chmistore(mp_int *a,char* pcchStr,int cj)
{

int i,j;
char ch;
char chtem[4];

mp_digit yy=(mp_digit)255;
for (i=0; i <= a->used - 1; i++) {

chtem[3]=(char)(a->dp[i] & yy);
chtem[2]=(char)((a->dp[i] >> (mp_digit)8) & yy);
chtem[1]=(char)((a->dp[i] >> (mp_digit)16) & yy);
chtem[0]=(char)((a->dp[i] >> (mp_digit)24) & yy);

for(j=0;j<4;j++)
{
pcchStr[j+cj]=chtem[j];
}
}
ch=(char)255;
pcchStr[cj+3+1]=ch;

return MP_OKAY;
}

int myrng(unsigned char *dst, int len, void *dat)
{
int x;
for (x = 0; x < len; x++) dst[x] = rand() & 0xFF;
return len;
}
taylor_fjzhtaobao 2012-09-19
  • 打赏
  • 举报
回复
/*******************************************************************************
* Function Name : Ecc_encipher
* Description : Reads a block of data from the FLASH.
* Input : - QX : Public key X coordinate
- QY : Public key Y coordinate
* - GX : Curve G point X coordinate
* - GY : Curve G point Y coordinate
* - a :Curve parameter A
* - p :Finite field P
* Output : None
* Return : return a state
*******************************************************************************/
bool Ecc_points_mul(mp_int *qx,mp_int *qy, mp_int *px, mp_int *py,mp_int *d,mp_int *a,mp_int *p)
{
mp_int X1, Y1;
mp_int X2, Y2;
mp_int X3, Y3;
mp_int XX1, YY1;
mp_int A,P;

int i;
bool zero=FALSE;
char Bt_array[BIT_LEN]={0};
char cm='1';

mp_toradix(d,Bt_array,2);
mp_init_set_int(&X3, 0);
mp_init_set_int(&Y3, 0);
mp_init_copy(&X1, px);
mp_init_copy(&X2, px);
mp_init_copy(&XX1, px);
mp_init_copy(&Y1, py);
mp_init_copy(&Y2, py);
mp_init_copy(&YY1, py);

mp_init_copy(&A, a);
mp_init_copy(&P, p);

for(i=1;i<=KEY_LONG-1;i++)
{
mp_copy(&X2, &X1);
mp_copy(&Y2, &Y1);
Two_points_add(&X1,&Y1,&X2,&Y2,&X3,&Y3,&A,zero,&P);
mp_copy(&X3, &X2);
mp_copy(&Y3, &Y2);
if(Bt_array[i]==cm)
{
mp_copy(&XX1, &X1);
mp_copy(&YY1, &Y1);
Two_points_add(&X1,&Y1,&X2,&Y2,&X3,&Y3,&A,zero,&P);
mp_copy(&X3, &X2);
mp_copy(&Y3, &Y2);
}
}

if(zero)
{
return FALSE;//如果Q为零从新产生D
}

mp_copy(&X3, qx);
mp_copy(&Y3, qy);

mp_clear(&X1);
mp_clear(&Y1);
mp_clear(&X2);
mp_clear(&Y2);
mp_clear(&X3);
mp_clear(&Y3);
mp_clear(&XX1);
mp_clear(&YY1);
mp_clear(&A);
mp_clear(&P);

return TRUE;
}
/*******************************************************************************
* Function Name : Ecc_encipher
* Description : Reads a block of data from the FLASH.
* Input : - QX : Public key X coordinate
- QY : Public key Y coordinate
* - GX : Curve G point X coordinate
* - GY : Curve G point Y coordinate
* - a :Curve parameter A
* - p :Finite field P
* Output : None
* Return : return a state
*******************************************************************************/
int Two_points_add(mp_int *x1,mp_int *y1,mp_int *x2,mp_int *y2,mp_int *x3,mp_int *y3,mp_int *a,bool zero,mp_int *p)
{
mp_int x2x1;
mp_int y2y1;
mp_int tempk;
mp_int tempy;
mp_int tempzero;
mp_int k;
mp_int temp1;
mp_int temp2;
mp_int temp3;
mp_int temp4;
mp_int temp5;
mp_int temp6;
mp_int temp7;
mp_int temp8;
mp_int temp9;
mp_int temp10;


mp_init(&x2x1);
mp_init(&y2y1);
mp_init(&tempk);
mp_init(&tempy);
mp_init(&tempzero);
mp_init(&k);
mp_init(&temp1);
mp_init(&temp2);
mp_init_set(&temp3,2);
mp_init(&temp4);
mp_init(&temp5);
mp_init(&temp6);
mp_init(&temp7);
mp_init(&temp8);
mp_init(&temp9);
mp_init(&temp10);

if(zero)
{
mp_copy(x1, x3);
mp_copy(y1, y3);
zero=FALSE;
goto L;
}
mp_zero(&tempzero);
mp_sub(x2, x1, &x2x1);
if(mp_cmp(&x2x1,&tempzero)==-1)
{
mp_add(&x2x1, p, &temp1);
mp_zero(&x2x1);
mp_copy(&temp1, &x2x1);
}
mp_sub(y2, y1, &y2y1);
if(mp_cmp(&y2y1,&tempzero)==-1)
{
mp_add(&y2y1, p, &temp2);
mp_zero(&y2y1);
mp_copy(&temp2, &y2y1);
}
if(mp_cmp(&x2x1, &tempzero)!=0)
{
mp_invmod(&x2x1,p,&tempk);

mp_mulmod(&y2y1, &tempk, p, &k);
}
else
{
if(mp_cmp(&y2y1, &tempzero)==0)
{
mp_mulmod(&temp3,y1,p,&tempy);
mp_invmod(&tempy,p,&tempk);
mp_sqr(x1, &temp4);
mp_mul_d(&temp4, 3, &temp5);
mp_add(&temp5, a, &temp6);
mp_mulmod(&temp6, &tempk, p, &k);
}
else
{
zero=TRUE;
goto L;
}
}
mp_sqr(&k, &temp7);
mp_sub(&temp7, x1, &temp8);
mp_submod(&temp8, x2, p, x3);

mp_sub(x1, x3, &temp9);
mp_mul(&temp9, &k, &temp10);
mp_submod(&temp10, y1, p, y3);


L:
mp_clear(&x2x1);
mp_clear(&y2y1);
mp_clear(&tempk);
mp_clear(&tempy);
mp_clear(&tempzero);
mp_clear(&k);
mp_clear(&temp1);
mp_clear(&temp2);
mp_clear(&temp3);
mp_clear(&temp4);
mp_clear(&temp5);
mp_clear(&temp6);
mp_clear(&temp7);
mp_clear(&temp8);
mp_clear(&temp9);
mp_clear(&temp10);

return 1;
}


int GetPrime(mp_int *m,int lon){
mp_prime_random_ex(m, 10, lon, \
(rand()&1)?LTM_PRIME_2MSB_OFF:LTM_PRIME_2MSB_ON, myrng, NULL);
return MP_OKAY;
}
void Get_B_X_Y(mp_int *x1,mp_int *y1,mp_int *b, mp_int *a, mp_int *p)
{
mp_int tempx,tempy;
mp_int temp;
mp_int compare;
mp_int temp1;
mp_int temp2;
mp_int temp3;
mp_int temp4;
mp_int temp5;
mp_int temp6;
mp_int temp7;
mp_int temp8;

mp_init_set_int (&compare, 0);
mp_init(&tempx);
mp_init(&tempy);
mp_init(&temp);
mp_init(&temp1);
mp_init(&temp2);
mp_init(&temp3);
mp_init(&temp4);
mp_init(&temp5);
mp_init(&temp6);
mp_init(&temp7);
mp_init(&temp8);

while(1)
{
//4a3+27b2≠0 (mod p)
GetPrime(b,40);
mp_expt_d(a, 3, &temp1);
mp_sqr(b, &temp2);
mp_mul_d(&temp1, 4, &temp3);
mp_mul_d(&temp2, 27, &temp4);
mp_add(&temp3, &temp4, &temp5);
mp_mod(&temp5,p,&temp);

if(mp_cmp(&temp, &compare)!=0 )
{
break;
}
}
//y2=x3+ax+b,随机产生X坐标,根据X坐标计算Y坐标
GetPrime(x1,30);
mp_expt_d(x1, 3, &temp6);
mp_mul(a, x1, &temp7);
mp_add(&temp6, &temp7, &temp8);
mp_add(&temp8, b, &tempx);
mp_sqrt(&tempx, y1);

mp_clear(&tempx);
mp_clear(&tempy);
mp_clear(&temp);
mp_clear(&temp1);
mp_clear(&temp2);
mp_clear(&temp3);
mp_clear(&temp4);
mp_clear(&temp5);
mp_clear(&temp6);
mp_clear(&temp7);
mp_clear(&temp8);
}

你想当“李逍遥”式的“大侠”吗? 这里无需计算机基础,无需编程经验,你也不必是计算机专业的在校大学生....只要爱好游戏,怀揣梦想! 有一定自主学习能力,跟着刘老师从“编程小白”修炼为游戏研发“大虾”吧!!!学习好Unity,其先决条件是一定要有稳固、扎实的编程基础!课程 《C# For Unity系列之入门篇》配套学习资料链接:http://pan.baidu.com/s/1gflxreN 密码:sou5;刘老师讲Unity学员群(2) 497429806一、热更新系列(技术含量:中高级):A:《lua热更新技术中级篇》https://edu.csdn.net/course/detail/27087B:《热更新框架设计之Xlua基础视频课程》https://edu.csdn.net/course/detail/27110C:《热更新框架设计之热更流程与热补丁技术》https://edu.csdn.net/course/detail/27118D:《热更新框架设计之客户端热更框架(上)》https://edu.csdn.net/course/detail/27132E:《热更新框架设计之客户端热更框架(中)》https://edu.csdn.net/course/detail/27135F:《热更新框架设计之客户端热更框架(下)》https://edu.csdn.net/course/detail/27136二:框架设计系列(技术含量:中级): A:《游戏UI界面框架设计系列视频课程》https://edu.csdn.net/course/detail/27142B:《Unity客户端框架设计PureMVC篇视频课程(上)》https://edu.csdn.net/course/detail/27172C:《Unity客户端框架设计PureMVC篇视频课程(下)》https://edu.csdn.net/course/detail/27173D:《AssetBundle框架设计_框架篇视频课程》https://edu.csdn.net/course/detail/27169三、Unity脚本从入门到精通(技术含量:初级)A:《C# For Unity系列之入门篇》https://edu.csdn.net/course/detail/4560B:《C# For Unity系列之基础篇》https://edu.csdn.net/course/detail/4595C: 《C# For Unity系列之中级篇》https://edu.csdn.net/course/detail/24422D:《C# For Unity系列之进阶篇》https://edu.csdn.net/course/detail/24465四、虚拟现实(VR)与增强现实(AR):(技术含量:初级)A:《虚拟现实之汽车仿真模拟系统 》https://edu.csdn.net/course/detail/26618五、Unity基础课程系列(技术含量:初级) A:《台球游戏与FlappyBirds—Unity快速入门系列视频课程(第1部)》 https://edu.csdn.net/course/detail/24643B:《太空射击与移动端发布技术-Unity快速入门系列视频课程(第2部)》https://edu.csdn.net/course/detail/24645 C:《Unity ECS(二) 小试牛刀》https://edu.csdn.net/course/detail/27096六、Unity ARPG课程(技术含量:初中级):A:《MMOARPG地下守护神_单机版实战视频课程(上部)》https://edu.csdn.net/course/detail/24965B:《MMOARPG地下守护神_单机版实战视频课程(中部)》https://edu.csdn.net/course/detail/24968C:《MMOARPG地下守护神_单机版实战视频课程(下部)》https://edu.csdn.net/course/detail/24979

27,382

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧