Bresenham椭圆算法

Bresenham椭圆算法
Bresenham椭圆算法

GIS专业实验报告(计算机图形学)

实验3 使用Bresenham画椭圆算法,绘制一个椭圆

姓名系别班级学号实验日期指导教师实验成绩

殷悦10级4班2010203482 2013.06.20 肖燕

一.实验目的及要求

根据Bresenham画椭圆算法,掌握绘制椭圆的程序设计方法。在绘制时应利用椭圆的对称性。注意,不能使用语言库中的画圆函数。

二.理论基础

1.Bresenham椭圆算法:

中点Bresenham椭圆绘制算法的基本原理与中点Bresenham画圆算法类似,也是尽可能的迫近椭圆(多边形迫近法),推导出圆弧的增量算法的表达式,找到最接近椭圆圆弧的像素点。

三.算法设计与分析

算法步骤:

(1) 输入椭圆的长半轴a和短半轴b。

(2) 计算初始值d = b*b + a * a * (-b + 0.25),x = 0, y = b。

(3) 绘制点(x, y)及其在四分象限上的另外3个对称点。

(4) 判断d的符号。若d <= 0,则先将d更新为d + b * b * (2 * x + 3),再将(x, y)更新为(x+1, y);否则先将d更新

为d + b * b * (2 * x + 3) + a * a (-2 * y + 2),再将(x, y)更新为(x+1, y-1)。

(5) 当b*b * (x+1) < a * a * (y - 0.5)时,重复步骤(3)和(4),否则转到步骤(6)。

(6) 用上半部分计算的最后点(x, y)来计算下半部分中d的初值: d = b * b * (x + 0.5) * (x + 0.5) + a * a * (y - 1) * (y - 1)

- a * a * b * b。

(7) 绘制点(x, y)及其在四分象限上的另外3个对称点。

(8) 判断d的符号。若d <= 0,则先将d更新为d + b * b * (2 * xi + 2) + a * a * (-2 * yi + 3), 再将(x, y)更新为(x+1,

y-1);否则先将d更新为d + a * a * (-2 * yi + 3),再将(x, y)更新为(x, y-1)。

(9) 当y >= 0,重复步骤(7)和(8),否则结束。

程序源码如下:

void drawEllipse (int a, int b, int xLoc, int yLoc)

{

glPushMatrix ();

int x, y;

float d1, d2, aa, bb;

aa = a * a;

bb = b * b;

d1 = bb + aa * (-b + 0.25);

glTranslatef ((GLfloat) xLoc, (GLfloat) yLoc, 0.0f);

x = 0;

y = b;

glBegin (GL_POINTS);

glV ertex2i ( x, y);

glV ertex2i (-x, y);

glV ertex2i (-x, -y);

glV ertex2i ( x, -y);

while (bb * (x + 1) < aa * (y - 0.5))

{

if (d1 <= -0.000001)

{

d1 += bb * ((x << 1) + 3);

}

else

{

d1 += bb * ((x << 1) + 3) + aa * (2 - (y << 1));

-- y;

}

++ x;

glVertex2i ( x, y);

glVertex2i (-x, y);

glVertex2i (-x, -y);

glVertex2i ( x, -y);

}

d2 = bb * (0.25 * x) + aa * (1 - (y << 1));

while (y > 0)

{

if (d2 <= -0.000001)

{

++ x;

d2 += bb * ((x + 1) << 1) + aa * (3 - (y << 1));

}

else

{

d2 += aa * (3 - (y << 1));

}

-- y;

glVertex2i ( x, y);

glVertex2i (-x, -y);

glVertex2i (-x, y);

glVertex2i ( x, -y);

}

glEnd ();

glPopMatrix ();

}

四.程序调试及运行结果的自我分析与自我评价

图1 椭圆运行结果

五.实验心得及建议

通过这次自己动手作程序,加深了对以往所学知识的了解和应用。把老师讲的东西,通过自己的努力和探索并加以研究,变成自己所能理解的东西。在已经基本上掌握了VB基础,又加深了各项功能的认识理解。我会把这次作业当作起点,更加加深对VB软件的研究,为自己可以早日熟练掌握此软件的各项操作步骤而努力。

椭圆画法

椭圆画法 椭圆的长轴为AB,短轴为CD。 作图步骤如下: (1)连接A、C,以O为圆心、OA为半径画弧,与CD的延长线交于点E,以C为圆心、CE为半径画弧,与AC交于点F; (2)作AF的垂直平分线,与长短轴分别交于点O1、O2,再作对称点O3、O4;O1、O2、O3、O4即为四段圆弧的圆心; (3)分别作圆心连线O1O4、O2O3、O3O4并延长; (4)分别以O1、O3为圆心,O1A或O3B为半径画小圆弧K1AK和NBN1,分别以O2、O4为圆心,O2C或O4D为半径画大圆弧KCN和N1DK1(切点K、K1、N1、N分别位于相应的圆心连线上),即完成近似椭圆的作图。 一、四心近似法 已知相互垂直且平分的椭圆长轴和短轴,则椭圆的近似画法(四心近似法)步骤如下所示: 第一步:

画出长轴AB和短轴CD,连接AC; 第二步: 在AC上截取CF,使其等于AO与CO之差CE; 第三步: 作AF的垂直平分线,使其分别交AO和OD(或其延长线)于O1和O2点。以O为对称中心,找出O1的对称点O3及O2的对称点O4,此O1、O2、O3、O4各点即为所求的四圆心。通过O2和O1、O2和O3、O4和O3各点,分别作连线;

第四步: 分别以O2和O4为圆心,O2C(或O4D)为半径画两弧。再分别以O1和O3为圆心,O1A(或O3B)为半径画两弧,使所画四弧的接点分别位于O2O1、O2O3、O4O1和O4O3的延长线上,即得所求的椭圆 二、同心圆法 已知相互垂直且平分的椭圆长轴和短轴,则椭圆同心圆画法的步骤如下所示: 第一步: 以椭圆中心为圆心,分别以长、短轴长度为直径,作两个同心圆; 第二步:

椭圆曲线上的部分盲签名方案

第27卷第4期纺织高校基础科学学报Vol.27,No.4 2014年12月BASICSCIENCESJOURNALOFTEXTILEUNIVERSITIESDec.,2014  文章编号:1006‐8341(2014)04‐0508‐04 椭圆曲线上的部分盲签名方案 张建中,陈 楠,苑 飞 (陕西师范大学数学与信息科学学院,陕西西安710062) 摘要:针对椭圆曲线密码体制具有签名密钥短、运行速度快等优点,结合动态秘密共享和部分盲签名技术,提出了一个新的动态部分盲签名方案.该方案不但具备门限签名和盲签名的特性而且还可以随时更新签名密钥,密钥的分发和更新过程采用公开验证的方法,可以有效地抵抗相互欺诈行为的发生.分析表明,该方案操作简单,安全性高,应用范围广. 关键词:椭圆曲线;动态秘密共享;部分盲签名;门限签名 中图分类号:TP393 文献标识码:A 0 引 言 在现实生活中,人们从安全和保险的角度考虑,对一些具有重要价值的信息的访问权限不能只交给一个人掌握,如果只有一人拥有打开某信息的密钥,一旦密钥丢失或持有者无法提供正确的密钥,就会带来严重的损失.因此,1979年Shamir[1]提出了将秘钥分解成多个碎片发送给多个人掌管,其中达到一定数量的成员的集合便可以恢复密钥的(t,n)秘密分享的思想.秘密分享是门限密码学的基础,人们在这种思想的基础上提出了可验证的秘密分享体制[2],公开可验证秘密分享体制[3].为了避免密钥受到长期的、逐步的攻击,有时需要随时更新签名者的密钥,人们又提出了动态秘密分享体制[4],其后又提出许多新的秘密共享体制[5‐6].将这些思想与一些密码体制相结合形成了一些更安全、高效的新方案,比如基于RSA的门限签名方案,基于ELGamal的门限签名方案,还有基于椭圆曲线的门限签名方案等.与同等条件下的一些密码体制相比,椭圆曲线密码体制因具有签名密钥短、运行速度快、安全性高等优点而成为密码学界研究的热点.1992年ScottVanstone提出了椭圆曲线数字签名的算法[7](ECDSA),由于这种算法需要求解椭圆曲线上的逆元,运算复杂,经不断被改进,新的高效的椭圆曲线数字签名方案[8‐9]被提出,算法中尽量避免求解逆元,从而提高了椭圆曲线数字签名方案的运行效率. 盲签名的概念[10]是1982年Chaum在美国密码学会上首次提出的,盲签名要求用户和签名者之间达成一个协议,如果协议被正确执行,则用户获得签名者的签名,但是对签名人来说却不知道所签消息的具体内容[11].部分盲签名[12]是在盲签名的基础上由Abe和Fujisaki在1996年提出的,在部分盲签名方案中[13],签名人可以在签名中嵌入一个和用户事先约定好的公共信息,用来防止普通盲签名中被签名的消 收稿日期:2014‐01‐10 基金项目:国家自然科学基金资助项目(61173190,61273311);陕西省自然科学基础研究计划资助项目(2010JQ8027); 陕西省教育厅科研计划项目(2010JK398,12JK1003);中央高校基本科研业务费专项资金资助项目 (GK201002041) 通讯作者:张建中(1960‐),男,陕西省周至县人,陕西师范大学教授,博士.研究方向为信息安全与密码学及认证理论.E‐mail:jzzhang@snnu.edu.cn

一种椭圆曲线快速生成算法

一种椭圆曲线参数生成的快速算法 谷勇浩 刘勇 (北京邮电大学通信网络综合技术研究所) 摘要:椭圆曲线密码体制是公钥密码中的研究热点。该文介绍了椭圆曲线密码体制的基本概念及相关知识,讨论了目前基于离散对数问题的椭圆曲线密码的研究动态。本文的创新点是针对目前椭圆曲线研究重点之一——椭圆曲线参数生成算法,给出了一种生成参数a 、b 的快速算法。这种算法利用了Jacobi 符号和二次剩余的理论,并且用matlab 计算出利用这种算法生成一个椭圆曲线的平均时间,最后我们分析了今后椭圆曲线密码系统的研究方向和重点。 关键词:椭圆曲线;离散对数问题;Jacobi 符号;二次剩余;阶 1976年Diffie 和Hellman 提出公钥密码思想以来,国际上提出了许多种公钥密码体制的实现方案。一些已经被攻破,一些被证明是不可行的。目前,只有3类公钥密码体制被认为是安全有效的,按照其所依据的数学难题划分为:基于大整数分解问题(IFP ),如RSA 体制和Rabin 体制;基于有限域离散对数问题(DLP ),如Diffie-Hellman 体制和ElGamal 体制;基于椭圆曲线离散对数问题(ECDLP ),如椭圆密码体制。椭圆曲线应用到密码学上最早是由Neal Koblitz 和Victor Miller 在1985年分别独立提出的。它是目前已知的公钥体制中,对每一比特所提供加密强度最高的一种体制。它具有安全性高、密钥量小、灵活性好的特点,受到了国际上的广泛关注。而SET(Secure Electronic Transaction)协议的制定者已把它作为下一代SET 协议中缺省的公钥密码算法。深入研究基于椭圆曲线离散对数问题的公钥密码具有很大的现实意义。 1建立椭圆曲线公钥密码体制 1.1椭圆曲线域的参数 在基于椭圆曲线的加解密和数字签名的实现方案中,首先要给出椭圆曲线域的参数来确定一条椭圆曲线。在 IEEE P1363标准中,定义其参数为一个七元组:T=(q,FR,a,b,G,n,h),其中q 代表有限域GF(q),q 为素数或 2 m ;FR 为域表示法,如f(x)为 2 m F 域元素的不可约 多项式的表示法;曲线的方程,当q 为素数时,方程为2 3 ax b y x =++,当q 为2m 时, 方程为 2 32 xy a b y x x +=++,a,b 是方程中的系数;G 为基点;n 为大素数并且等于点G 的阶,h 是小整数称为余因子且#()/q h E n F =。主要的安全性参数是n ,因此ECC 密钥 的长度就定义为n 的长度。 1.2椭圆曲线密码的密钥 选取了基域 q F 和椭圆曲线后,得到了在有限域 q F 上的曲线E 确定的具体形式,即 上述的椭圆曲线域参数的一个七元组。每个用户选取一个整数d(1≤d ≤n-1) 作为其私钥,而以点Q=dG(G 为基点)作其公钥,这样形成一个椭圆曲线公钥密码系统。在这个密码体制中,具体的曲线,基域 q F ,基点G 及其阶n ,以及每个用户的公钥都是该系统的公开参

椭圆曲线密码总结大全

椭圆曲线密码 概述: 椭圆曲线密码学(ECC, Elliptic curve cryptography )是基于椭圆曲线数学的一种公钥密码的方法。1985年,Neal Koblitz 和Victor Miller 分别独立提出了椭圆曲线密码体制(ECC),其依据就是定义在椭圆曲线点群上的离散对数问题的难解性。 引言: ECC 被广泛认为是在给定密钥长度的情况下,最强大的非对称算法,因此在对带宽要求十分紧的连接中会十分有用。 ECC 的主要优势是在某些情况下它比其他的方法使用更小的密钥——比如RSA ——提供相当的或更高等级的安全。ECC 的另一个优势是可以定义群之间的双线性映射,基于Weil 对或是Tate 对;双线性映射已经在密码学中发现了大量的应用,例如基于身份的加密。不过一个缺点是加密和解密操作的实现比其他机制花费的时间长。 国家标准与技术局和ANSI X9已经设定了最小密钥长度的要求,RSA 和DSA 是1024位,ECC 是160位,相应的对称分组密码的密钥长度是80位。NIST 已经公布了一列推荐的椭圆曲线用来保护5个不同的对称密钥大小(80, 112, 128, 192, 256)。一般而言,二进制域上的ECC 需要的非对称密钥的大小是相应的对称密钥大小的两倍。 椭圆曲线密码学的许多形式有稍微的不同,所有的都依赖于被广泛承认的解决椭圆曲线离散对数问题的困难性上,对应有限域上椭圆曲线的群。 引理及有关概念: (1) 无穷远元素(无穷远点,无穷远直线)平面上任意两相异直线的位置关系 有相交和平行两种。引入无穷远点,是两种不同关系统一。AB ⊥L1, L2∥L1,直线AP 由AB 起绕A 点依逆时针方向转动,P 为AP 与L1的交点,如图1。Q=∠BAP →π /2则AP → L2,可设想L1上有一点P ∞,它为L2和L1的交点,称之为无穷远点。直线L1上的无穷远点只能有一个(因为过A 点只能有一条平行于L1的直线L2,而两直线的交点只能有一个)。 图1 结论: 1. 平面上一组相互平行的直线,有公共的无穷远点(为与无穷远点相区别,把

案例2-直线中点Bresenham算法

课程实验报告

步骤 为了规范颜色的处事,定义了CRGB类,重载了“+”,“-”、“*”、“\”、“+=”、“-=”、“*=”、“/=”运算符。成员函数Normalize()将颜色分量red,green,blue规范到[0,1]闭区间内。 RGB.h #pragma once class CRGB { public: CRGB(); CRGB(double, double, double); ~CRGB(); friend CRGB operator + (const CRGB&, const CRGB&); friend CRGB operator - (const CRGB&, const CRGB&); friend CRGB operator * (const CRGB&, const CRGB&); friend CRGB operator * (const CRGB&, double); friend CRGB operator * (double, const CRGB&); friend CRGB operator / (const CRGB&, double); friend CRGB operator += (const CRGB&, const CRGB&); friend CRGB operator -= (const CRGB&, const CRGB&); friend CRGB operator *= (const CRGB&, const CRGB&); friend CRGB operator /= (const CRGB&, double); void Normalize(); public: double red; double green; double blue; }; RGB.cpp #include"stdafx.h" #include"RGB.h" CRGB::CRGB() { red = 1.0; green = 1.0; blue = 1.0;

串的模式匹配算法实验报告

竭诚为您提供优质文档/双击可除串的模式匹配算法实验报告 篇一:串的模式匹配算法 串的匹配算法——bruteForce(bF)算法 匹配模式的定义 设有主串s和子串T,子串T的定位就是要在主串s中找到一个与子串T相等的子串。通常把主串s称为目标串,把子串T称为模式串,因此定位也称作模式匹配。模式匹配成功是指在目标串s中找到一个模式串T;不成功则指目标串s中不存在模式串T。bF算法 brute-Force算法简称为bF算法,其基本思路是:从目标串s的第一个字符开始和模式串T中的第一个字符比较,若相等,则继续逐个比较后续的字符;否则从目标串s的第二个字符开始重新与模式串T的第一个字符进行比较。以此类推,若从模式串T的第i个字符开始,每个字符依次和目标串s中的对应字符相等,则匹配成功,该算法返回i;否则,匹配失败,算法返回0。 实现代码如下:

/*返回子串T在主串s中第pos个字符之后的位置。若不存在,则函数返回值为0./*T非空。 intindex(strings,stringT,intpos) { inti=pos;//用于主串s中当前位置下标,若pos不为1则从pos位置开始匹配intj=1;//j用于子串T中当前位置下标值while(i j=1; } if(j>T[0]) returni-T[0]; else return0; } } bF算法的时间复杂度 若n为主串长度,m为子串长度则 最好的情况是:一配就中,只比较了m次。 最坏的情况是:主串前面n-m个位置都部分匹配到子串的最后一位,即这n-m位比较了m次,最后m位也各比较了一次,还要加上m,所以总次数为:(n-m)*m+m=(n-m+1)*m从最好到最坏情况统计总的比较次数,然后取平均,得到一般情况是o(n+m).

椭圆曲线加密算法

椭圆曲线加密算法 椭圆曲线密码学(英语:Elliptic curve cryptography,缩写为 ECC),一种建立公开密钥加密的算法,基于椭圆曲线数学。椭圆曲线在密码学中的使用是在1985年由Neal Koblitz和Victor Miller分别独立提出的。 ECC的主要优势是在某些情况下它比其他的方法使用更小的密钥——比如RSA 加密算法——提供相当的或更高等级的安全。ECC的另一个优势是可以定义群之间的双线性映射,基于Weil对或是Tate对;双线性映射已经在密码学中发现了大量的应用,例如基于身份的加密。不过一个缺点是加密和解密操作的实现比其他机制花费的时间长 1.椭圆曲线 在数学上,椭圆曲线(英语:Elliptic curve,缩写为EC)为一代数曲线,被下列式子所定义 y2=x3+ax+b 其是无奇点的;亦即,其图形没有尖点或自相交。 满足此条件的a b满足:4a3+27b2≠0 图1 在基础上需要定义一个无穷远的点,将此点作为零点:此时椭圆曲线定义为:{(x,y)∈?2|y2=x3+ax+b,4a3+27b2≠0}∪{0} 在椭圆曲线中的群的运算律: 1. 所有的点都在椭圆曲线上 2. 0点作为群上的单元点即 P+0=P 3. P点关于X轴的对称点为P点的逆即 P+(?P)=0

4.对于位于同一条直线上的三个点P,Q,R.则有 P+Q+R=0 图2 P+Q+R=0(无限远点 P Q R三个点的位置是任意的,他们满足加法的结合律,因为这个群是一个阿贝尔群。 2.椭圆曲线加法 当P和Q不相等时(x P≠x Q) 由于是在阿贝尔群上可以将P+Q+R=0改写为P+Q=?R所以在椭圆曲线上的加法定义为P Q 两点加法为P,Q两点连线与曲线的交点R的关于X轴对称点?R 图2-3 P+Q=-R P Q两点的直线的斜率为: m=y P?y Q x P?x Q 这条线与曲线的交点为:R=(x R,y R) x R=m2?x P?x Q y R=y P+m(x R?x P) 因此(x P,y P)+(x Q,y Q)=(x R,?y R)如果在图上表示即为上述的P+Q=?R

串匹配实验报告

实验成绩 华中师范大学计算机科学系 实验报告书 实验项目:串匹配问题 课程名称:算法分析与设计 班级: 1 实验时间:周六早上8:30-11:30 实验目的:一、深刻理解并掌握蛮力法的设计思想。 二、提高应用蛮力法设计算法的技能。

三、理解这样一个观点:用蛮力法设计的算法,一般来说,经过适 当的努力之后,都可以对算法的第一个版本进行一定程度的改 良,改进其时间性能。 实验报告要求:1、实现BF算法。 2、实现BF的改进算法:KMP算法。 3、对上述算法进行时间复杂性分析,并设计实验程序,分析结果。 BF算法内容: #include #include using namespace std; #define M 80 #define N 50 void main() { char S[M],T[N]; int i,j,count=0; cout<<"请输入长串S:"; gets(S); cout<<"请输入子串T:"; gets(T); i=0;j=0; while(count!=strlen(T)&&i<(strlen(S))) { int k=i; if(S[i]==T[j]) {i++;j++,count++;} else {i=k+1;j=0;count=0;} }

if(count==strlen(T)) { cout<<"子串从长串的第"< # include using namespace std; #define M 80 #define N 50 void getnext(char *t,int *next)

椭圆的画法

课题:椭圆的画法 刘本华 【教学目的】通过教学使学生了解本椭圆及椭圆物体的画法等。 【教学重点】椭圆的透视规律。 【教学难点】椭圆的画法。 【教学方法】讲授法、图片展示法。 【教学课时】3课时 【教学过程】 第一课时:椭圆的画法 一、教学导入 展示圆的变化,用一个水桶在视平线上下展示,引出圆的变化规律:离视平线越近越椭,离视平线越远越圆。 二、椭圆的画法,教师黑板上示范。 三、总结: 1、椭圆的边是连续弯曲的,绝对不会有直边和角出现比较两个不正确的图形,它们一个有角,一个有直边。而正确的一个边缘是圆顷的弧形。 2、用横竖轴线将椭圆分害4成四等分.将椭圆四分之一部分涂上阴影。如果分割后的四部分形状不一样,你就画得不对,虽然每块阴影的形状应该是同样的,但它从垂直、水平和对角方向上看是一模一样的。

3、我们看到的这组椭圆是圆在不同的水平线上的形状.当眼睛和圆在同一水平线时。我们看到的是线;随着眼睛与圆之间的视角发生变化。椭圆的长度增加了.而宽度不变;当眼睛垂直于水平面时.我们看到的是完整的圆。 四、学生练习 1、学生练习,教师巡回指导 2、及时表扬好的同学和纠正错误的画法。 五、课堂小结 1、总结本节课所学内容。 2、布置下节课内容及工具材料准备。 板书设计

第二课时:椭圆——单个物体画法 一、如何观察实物 注意它的整体形状;注意它的高度,比较它的宽度;注意光照的方向,它的颜色,它的质地。它有反射光吗?它是被光线环绕着,还是光线从一个方向照射形成一定的角度?当你用这样的方法去观察一个物体时,真实的物体与你画的物体就非常接近了。当你把这个物体视为形状、颜色或光照的形状时,你也就初具了用画家的眼光观察物体的能力,虽然你没有问上述这些问题,但实际上你想得越少,反而看得越多。作为初学者,就是要经常想这些问题,才能使你所看见的水罐或杯子,能像画家眼中的形状、颜色、质地和构成一样,就好比照相机拍摄到的图像,它也被接收到我们的视网膜上。 二、教师示范实物画法 1黑板上示范画法。 2、绘画方法总结:变画边改 当你描绘完实物的轮廓时,把画举起,要不必移动你的头就能看到画和实物。比较一下哪部分画得对,重要的是哪部分画得不对。然后再仔细重画正确的线条,之后擦掉不正确的线条,不断地改正标记和线条,直到看上去像被画的物体为止。 当你画正确的线时,是在没有擦掉不正确的线之前,这样你比较容易画好。因为你可以在参照和比较不正确的线的同时,找到正确的位置。如果你先擦掉不正确的线,可能你又将画上不正确的线。 如果你对眼睛看到的部分感到迷茫或感觉杂乱,不要紧,因为眼睛会趋向于正确的部分,而忽略不正确的部分。如果两个物体的形状不相似,眼睛能做出比较,并能非常迅速地告诉你哪个物体的形状是正确的,哪个物体的形状是不正确

Bresenham算法

Course Page
Page 1 of 6
课程首页 > 第二章 二维图形的生成 > 2.1 直线的生成 > 2.1.2 生成直线的Bresenham算法
全部隐藏
2.1.2 生成直线的Bresenham算法
从上面介绍的DDA算法可以看到,由于在循环中涉及实型数据的加减运算,因此直线的生成速度较慢。 在生成直线的算法中,Bresenham算法是最有效的算法之一。Bresenham算法是一种基于误差判别式来生成直线的方法。 一、直线Bresenham算法描述: 它也是采用递推步进的办法,令每次最大变化方向的坐标步进一个象素,同时另一个方向的坐标依据误差判别式的符号来决定是否也要步进一 个象素。 我们首先讨论m=△ y/△x,当0≤m≤1且x1有两种Bresenham算法思想,它们各自从不同角度介绍了Bresenham算法思想,得出的误差判别式都是一样的。 二、直线Bresenham算法思想之一: 由于显示直线的象素点只能取整数值坐标,可以假设直线上第i个象素点坐标为(xi,yi),它是直线上点(xi,yi)的最佳近似,并且xi=xi(假设 m<1),如下图所示。那么,直线上下一个象素点的可能位置是(xi+1,yi)或(xi+1,yi+1)。
由图中可以知道,在x=xi+1处,直线上点的y值是y=m(xi+1)+b,该点离象素点(xi+1,yi)和象素点(xi+1,yi+1)的距离分别是d1和d2:
d1=y-yi=m(xi+1)+b-yi d2=(yi+1)-y=(yi+1)-m(xi+1)-b 这两个距离差是 d1-d2=2m(xi+1)-2yi+2b-1
(2-8) (2-9)
(2-10)
我们来分析公式(2-10): (1)当此值为正时,d1>d2,说明直线上理论点离(xi+1,yi+1)象素较近,下一个象素点应取(xi+1,yi+1)。 (2)当此值为负时,d1mhtml:file://C:\Documents and Settings\Administrator\桌面\Course Page.mht
2011-7-12

一、单项选择题(每题2分,共42分) 1. 应用简单的匹配算法对主串s=" BDBABDABDAB"与子串t=" BDA"进行模式匹配,在匹配成功时,进行的字符比较总次数为()。 A. 7 B. 9 C. 10 D. 12 2. 采用两类不同存储结构的字符串可分别简称为( ) A.主串和子串 B.顺序串和链串 C.目标串和模式串 D.变量串和常量串 3. 串的操作函数str定义为: int str(char*s) { char *p=s; while (*p!=′\0′)p++; return p-s; } 则str(″abcde″)的返回值是() A.3 B.4 C.5 D.6 4. 在目标串T[0..n-1]=″xwxxyxy″中,对模式串P[0..m-1]=″xy″进行子串定位操作的结果是( ) A.0 B.2 C.3 D.5 5. 如下陈述中正确的是() A.串是一种特殊的线性表B.串的长度必须大于零 C.串中元素只能是字母D.空串就是空白串 6. 执行下列程序段后,串X的值为() S=〞abcdefgh〞; T=〞xyzw〞; substr (X,S,2,strlen(T)); substr (Y,S, stelen(T),2); strcat (X,Y); A.〞cdefgh〞B.〞cdxyzw〞 C.〞cdefxy〞D.〞cdefef〞 7. 判断两个串大小的基本准则是( ) A.两个串长度的大小 B.两个串中首字符的大小 C.两个串中大写字母的多少 D.对应的第一个不等字符的大小 8. .已知函数Sub(s,i,j)的功能是返回串s中从第i个字符起长度为j的子串,函数Scopy(s,t)的功能为复制串t到s。若字符串S=″SCIENCESTUDY″,则调用函数Scopy(P,Sub(S,1,7))后得到( ) A.P=″SCIENCE″ B.P=″STUDY″ C.S=″SCIENCE″ D.S=″STUDY″ 9. 5.两个字符串相等的条件是() A. 串的长度相等 B. 含有相同的字符集 C. 都是非空串 D. 串的长度相等且对应的字符相同 10. 一个链串的结点类型定义为 ﹟define NodeSize 6

基于椭圆曲线的一种高效率数字签名

第26卷第2期 计算机应用与软件 Vol 126No .2 2009年2月 Computer App licati ons and Soft w are Feb .2009 基于椭圆曲线的一种高效率数字签名 侯爱琴 高宝建 张万绪 强 媛 (西北大学信息科学与技术学院 陕西西安710069) 收稿日期:2007-07-09。陕西省自然科学基金项目(2004A11)。侯爱琴,讲师,主研领域:信息安全,电子信息技术。 摘 要 为给出一种基于椭圆曲线密码的高效率的数字签名方案。不仅在算法设计时完全避免了费时的求逆运算,而且利用消 息HASH 值的汉明重量作为消息摘要进行签名与验证。结果在同等安全性下,该方案比通用的ECDS A 等方案运行时间更短。新方案可适用于网络等对签名实时性要求较高的场合。 关键词 椭圆曲线密码 哈希函数 汉明重量 椭圆曲线数字签名 A H I GH EFF IC I ENCY D IG ITAL S IGNATURE BASED O N ELL I PT IC CURVE Hou A iqin Gao Baojian Zhang W anxu Q iang Yuan (School of Infor m ation Science and Technology,N orthw est U niversity,X i ’an 710069,Shaanxi,China ) Abstract T o offer a high efficiency digital signature based on elli p tic curve cryp t ography .The design of the algorith m not only avoids ti m e 2costing inverse operati on comp letely but als o uses the hamm ing weight of HASH code of a message instead of HASH code itself as the message digest t o partici pate in the signature and verifying calculati on .The ne w scheme cost less ti m e than the popular EC DS A.The ne w sche me is a 2dap ted t o higher real 2ti m e needs f or signature such as internet . Keywords Elli p tic curve cryp t ography (ECC ) Hash Ha mm ing weight Elli p tic curve digital signature (EC DS A ) 0 引 言 数字签名是电子商务和网络安全认证的核心技术。基于公钥密码的数字签名体制一般有三类:基于大整数分解问题(I FP )的,如RS A;基于离散对数问题(DLP )的,如著名的E I Ga 2mal,DS A 等;基于椭圆曲线离散对数问题(EC DLP )的,如I EEE P1363标准中的EC DS A 等椭圆曲线数字签名。其中ECDLP 最难解,除几类特殊椭圆曲线外迄今没有找到有效的求解算法。椭圆曲线密码(ECC )是迄今为止每比特具有最高安全强度的密码系统,160位ECC 密钥的安全性能与1024位RS A 或ElGa mals 的密钥相当。 本文研究了以椭圆曲线密码理论为基础的一种高效率数字签名系统。 1 基于ECC 的数字签名方案分析 现有的椭圆曲线数字签名方案,典型的如ECDS A 是美国国家标准技术研究所(N I ST )出台的ANSI X9.62标准,其详细描述可参见文献[1-3];EC 2KC DS A 方案是韩国基于证书数字签名算法(KC DS A )的椭圆曲线版本,具体方案可参见文献[1]描述。还有E I Ga mal 方案等都是将有限域F p 上离散对数签名方案移植到椭圆曲线群上。 据文献[4]把一个传统的离散对数体制转变为椭圆曲线体制需要进行以下转换:①把模乘运算转变为椭圆曲线上的点加运算;②把模幂运算转换为椭圆曲线上的点乘运算。 而有限域F p 上离散对数签名方案一般是基于签名方程u =dv +kw (mod p -1),详见文献[5,6]。它由五个元素(d,k,u, v,w )组成,其中d 是签名者的密钥,k 是每次签名时生成的随机 整数(即消息密钥),u,v,w 可以分别取e,r ,s,其中,e =h (m )为被签名消息的Hash 值,r 是一个与k 有关的量,s 是消息m 的签名。 可以用不同的(e,r ,s )组合代替(u,v,w ),并且e,r,s 可分别换成其加法或乘法逆元,由此可以衍生出不同的签名方程,即可得到不同的数字签名方案。但不是所有的数学组合都能产生安全的数字签名方案,Harn 和Xu 给出了安全的离散对数签名方案的设计规则,并列出所有符合这种设计规则的数字签名方案[7]。 基于ECC 的E I Ga mal 方案和EC DS A 是其中的第(4)种方案,取u =e,v =r ,w =s,即为通用方程u =vd +kw (mod p )的变体:e =dr +ks,等价于s =k -1(e +dr ),该方程为EC DS A 签名方程;相应的验证方程s -1(eG +r Q )=kG 。 ECDS A 方案中的公钥产生算法是Q =dG,在签名的生成和验证时分别计算k -1mod n 和s -1mod n ,需要模逆运算。EC 2 KC DS A 方案最大的特点是公钥产生算法是Q =d -1 P ,采用了逆的预运算,这使得签名的生成和验证过程不需要进行模逆运算;EC 2KC DS A 方案的另一个特点是在计算消息的Hash 值前,将签名者的证书数据加入消息(计算e =H (hcert,m )),能够抵抗基于参数组数据的攻击。 在现有的椭圆曲线加密或者签名过程中,求逆是最费时的操作,一次求逆的时间大约相当于80次点乘运算,因而求逆是

字符串匹配算法总结

Brute Force(BF或蛮力搜索) 算法: 这是世界上最简单的算法了。 首先将匹配串和模式串左对齐,然后从左向右一个一个进行比较,如果不成功则模式串向右移动一个单位。 速度最慢。 那么,怎么改进呢? 我们注意到Brute Force 算法是每次移动一个单位,一个一个单位移动显然太慢,是不是可以找到一些办法,让每次能够让模式串多移动一些位置呢? 当然是可以的。 我们也注意到,Brute Force 是很不intelligent 的,每次匹配不成功的时候,前面匹配成功的信息都被当作废物丢弃了,当然,就如现在的变废为宝一样,我们也同样可以将前面匹配成功的信息利用起来,极大地减少计算机的处理时间,节省成本。^_^ 注意,蛮力搜索算法虽然速度慢,但其很通用,文章最后会有一些更多的关于蛮力搜索的信息。 KMP算法 首先介绍的就是KMP 算法。 这个算法实在是太有名了,大学上的算法课程除了最笨的Brute Force 算法,然后就介绍了KMP 算法。也难怪,呵呵。谁让Knuth D.E. 这么world famous 呢,不仅拿了图灵奖,而且还写出了计算机界的Bible (业内人士一般简称TAOCP). 稍稍提一下,有个叫H.A.Simon的家伙,不仅拿了Turing Award ,顺手拿了个Nobel Economics Award ,做了AI 的爸爸,还是Chicago Univ的Politics PhD ,可谓全才。 KMP 的思想是这样的: 利用不匹配字符的前面那一段字符的最长前后缀来尽可能地跳过最大的距离 比如 模式串ababac这个时候我们发现在c 处不匹配,然后我们看c 前面那串字符串的最大相等前后缀,然后再来移动 下面的两个都是模式串,没有写出来匹配串 原始位置ababa c 移动之后aba bac 因为后缀是已经匹配了的,而前缀和后缀是相等的,所以直接把前缀移动到原来后缀处,再从原来的c 处,也就是现在的第二个b 处进行比较。这就是KMP 。 Horspool算法。 当然,有市场就有竞争,字符串匹配这么大一个市场,不可能让BF 和KMP 全部占了,于是又出现了几个强劲的对手。

基于椭圆曲线和RSA的数字签名的性能分析,数字签名,椭圆曲线

基于椭圆曲线和RSA的数字签名的性能分析,数字签名,椭圆曲线密码体制,RSA,C++ 1引言数字签名是实现认证的重要工具,他在身份认证、数据完整性、抗抵赖性以及匿名性等方面有重要的应用,是电子商务应用、电子政务推广中的核心技术,数字签名能保证文件中每页内容均不会被改动或替换。数字签名是特指以公钥密码实现的签名,或者可以定义为记录的一次变换,通过一个非对称密码系统和一个杂凑函数,使得有初始记录和签名者公钥的任何人都可以准确地判断该变换是否由相对应的私钥产生、初始记录在变换之后是否被修 1 引言 数字签名是实现认证的重要工具,他在身份认证、数据完整性、抗抵赖性以及匿名性等方面有重要的应用,是电子商务应用、电子政务推广中的核心技术,数字签名能保证文件中每页内容均不会被改动或替换。数字签名是特指以公钥密码实现的签名,或者可以定义为记录的一次变换,通过一个非对称密码系统和一个杂凑函数,使得有初始记录和签名者公钥的任何人都可以准确地判断该变换是否由相对应的私钥产生、初始记录在变换之后是否被修改。 常用的数字签名体制:RSA,EIGamal,ECC。其中基于RSA的数字签名算法现在应用十分广泛,而基于ECC的数字签名算法ECDSA则是未来签名算法的热点方向,本文就两种算法的性能进行了分析和比较,同时讨论了各自的应用范围。 2 RSA的数字签名算法 RSA算法是公钥密码体制中最著名的算法,他是以其发明人Rivest,Shamir和Adleman三人的首字母来命名的。RSA是建立在大整数分解的困难上的,是一种分组密码体制。RSA即可用于数据加密,也可用于数字签名。 2.1 RSA数字签名算法密钥对产生的过程 (1)选择2个大的素数p,q。 (2)计算n:n=pq。 (3)随机选取e,满足1<e<φ(n),gcd(e.φ(n))=1,那么公钥就是(e,n)。 (4)计算d:满足ed=1modφ(n),那么私钥就是(d,n)。 2.2 RSA数字签名算法的签名过程

直线中点Bresenham算法

实验一基本图形生成算法 实验目的: 掌握中点Bresenham绘制直线的原理 设计中点Bresenham算法 编程实现中点Bresenham算法 实验描述: 使用中点Bresenham算法绘制斜率为0≤k≤1的直线。 算法设计: 直线中点Bresenham算法 1. 输入直线的起点坐标P0(x0,y0)和终点坐标P1(x1,y1)。 2. 定义直线当前点坐标x,y、定义中点偏差判别式d、定义直线斜率k、定义像素点颜色 rgb。 3. x=x0,y=y0,计算d=0.5-k,k=(y1-y0)/(x1-x0),rgb=RGB(0,0,255)。 4. 绘制点(x,y),判断d的符号。若d<0,则(x,y)更新为(x+1,y+1),d 更新为 d+1-k;否则(x,y)更新为(x+1,y),d更新为d-k。 5. 如果当前点x 小于x1,重复步骤4,否则结束。 源程序: 1)// TestView.h #include "InputDlg.h"//对话框头文件 #define ROUND(a) int(a+0.5) class CTestView : public CView { ….. } 2)//TestView.cpp void CTestView::OnMENUMbline()//菜单函数 { InputDlg dlg; if(dlg.DoModal()==IDOK) { AfxGetMainWnd()->SetWindowText(":直线中点Bresenham算法"); RedrawWindow(); Mbline(dlg.m_x0, dlg.m_y0, dlg.m_x1, dlg.m_y1); } } void CTestView::Mbline(double x0, double y0,double x1,double y1) //直线中点Bresenham函数 { CClientDC dc(this); COLORREF rgb=RGB(255,0,0); //定义直线颜色为红色 double x,y,d,k; x=x0;y=y0;k=(y1-y0)/(x1-x0);d=0.5-k;

串的朴素模式匹配算法(BF算法)

//算法功能:串的朴素模式匹配是最简单的一种模式匹配算法,又称为 Brute Force 算法,简称为BF算法 #include #include #define MAXL 255 #define FALSE 0 #define TRUE 1 typedef int Status; typedef unsigned char SString[MAXL+1]; //生成一个其值等于串常量strs的串T void StrAssign(SString &T, char *strs) { int i; T[0] = 0; //0号单元存储字串长度 for(i = 0; strs[i]; i++) //用数组strs给串T赋值 T[i+1] = strs[i]; T[0] = i; } //返回子串T在主串S中第pos个字符开始匹配的位置,若不存在,则返回0 int Index(SString S, SString T, int pos) { int i = pos, j = 1; while(i <= S[0] && j <= T[0]) { if(S[i] == T[j]) //继续比较后面的字符 { i++; j++; } else//指针回退,重新开始匹配 { i = i -j + 2; j = 1; } } if(j > T[0]) return i - T[0]; else return 0;

int main() { SString S, T; int m; char strs1[MAXL]; //建立主串S char strs2[MAXL]; //建立模式串T printf("请输入主串和子串:\n"); printf("主串S: "); scanf("%s", strs1); printf("子串T: "); scanf("%s", strs2); StrAssign(S, strs1); StrAssign(T, strs2); m = Index(S, T, 1); if(m) printf("主串 S = {%s}\n子串 T = {%s}\n在第 %d 个位置开始匹配!\n", strs1, strs2, m); else printf("主串 S = {%s}\n子串 T = {%s}\n匹配不成功!\n", strs1, strs2); return 0; }

椭圆曲线密码的C语言设计与实现

计算机研究生开放研究 《椭圆曲线密码的C语言设计与实现》 美国GeneChiu基金资助 基于TOM算法库的ECC加密算法的C语言设计与实现 研究生徐立均 内容: 一、源代码下载 二、ECC算法的设计思想 三、椭圆曲线参数的选取和基点的确定 四、椭圆曲线的点加和纯量乘法 五、加密文件的读入与输出 六、密文的存取和读入 七、ECC加密的实现

八、ECC解密的实现 九、测试结果及分析 一、源代码下载 本文使用了TOM算法库实现了椭圆曲线公钥密码体制,能对各类不同的磁盘文件进行加密和解密。 1 请下载可执行程序MY_ECC.exe,此程序无需任何额外的LIB或DLL,可在Windows下独立运行,运行情况如下:

2 请下载源代码source.rar: 编译此源代码需要使用TOM的高精度算法库 MathLib.lib 和相关的头文件 tommath.h tommath_class.h tommath_superclass.h 一并打包在source.rar中,请下载

3 对于TOM的高精度算法库的详细说明,请看本站C语言: 二、 ECC算法的设计思想 根据椭圆曲线进行加密通信的过程,首先选定一个适合加密的椭圆曲线Ep(a,b),并取椭圆曲线上一点,作为基点G。选择一个私有密钥k,并生成公开密钥K=kG。加密时,将明文编码到Ep(a,b)上一点M,并产生一个随机整数r(r < n)。计算点C1=M+rK;C2=rG。将C1、C2存入密文。解密时,从密文中读出C1、C2,计算C1-kC2,根据:C1-kC2=M+rK-k(rG)=M+rK-r(kG)=M, 解得的结果就是点M,即明文。 三、椭圆曲线参数的选取和基点的确定 并不是所有的椭圆曲线都适合加密,y^2=x^3+ax+b是一类可以用来加密的椭圆曲线,也是最为简单的一类。下面我们就选用 y^2=x^3+ax+b作为我们的加密曲线。这条曲线定义在Fp上:两个满足下列条件的小于p(p为素数)的非负整数a、b:4a3+27b2≠0 (mod p) 则满足下列方程的所有点(x,y),再加上无穷远点∞ ,构成一条椭圆曲线。y^2=x^3+ax+b(mod p) 其中 x,y属于0到p-1间的整数,并将这条椭圆曲线记为Ep(a,b)。

相关文档
最新文档