python实现sm2加解密算法

时间: 2023-07-26 14:30:04 浏览: 125
sm2是一种国密算法,用于非对称加密和数字签名,其公钥和私钥的生成与DSA算法类似。下面是一个使用Python实现sm2加解密算法的示例代码: ```python from gmssl import sm2, func # 生成公钥和私钥 pri_key = func.random_hex(32) pub_key = sm2._kg(pri_key) # 加密明文 plaintext = b'Hello, world!' ciphertext, iv = sm2._encrypt(pub_key, plaintext) # 解密密文 decrypt_text = sm2._decrypt(pri_key, ciphertext, iv) print(decrypt_text) ``` 在上面的代码中,我们使用gmssl库来实现sm2算法,其中`_kg`函数用于生成公钥和私钥,`_encrypt`函数用于加密明文,`_decrypt`函数用于解密密文。 需要注意的是,这里生成的公钥和私钥都是16进制字符串,加密和解密的明文和密文都是字节串。如果需要将其转换成其他格式,可以使用`binascii`模块进行转换。
相关问题

python实现sm2加解密算法,不使用库

实现SM2算法需要用到椭圆曲线加密算法和哈希算法,这里我们使用Python内置的`hashlib`和`cryptomath`模块来实现。 首先,我们需要定义椭圆曲线的参数和基点: ```python P = 0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF A = 0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC B = 0x28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93 N = 0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123 Gx = 0x32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE171BEEB6E3A9D4F5B Gy = 0xBC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A ``` 然后,我们需要实现点加和点倍运算: ```python def add(p1, p2): if p1 is None: return p2 if p2 is None: return p1 x1, y1 = p1 x2, y2 = p2 if x1 == x2 and y1 != y2: return None if x1 == x2: m = (3 * x1 * x1 + A) * cryptomath.invmod(2 * y1, P) % P else: m = (y1 - y2) * cryptomath.invmod(x1 - x2, P) % P x3 = (m * m - x1 - x2) % P y3 = (m * (x1 - x3) - y1) % P return (x3, y3) def mul(k, p): if k == 0 or p is None: return None if k == 1: return p if k % 2 == 0: return mul(k // 2, add(p, p)) else: return add(p, mul(k - 1, p)) ``` 接下来,我们需要实现签名和验签的函数: ```python def sign(msg, d): e = int(hashlib.sha256(msg).hexdigest(), 16) k = func.random_int_range(1, N) while True: x, y = mul(k, (Gx, Gy)) r = (e + x) % N if r == 0 or k >= N: k = func.random_int_range(1, N) continue s = (cryptomath.invmod(k, N) * (d * r + k * e)) % N if s != 0: break k = func.random_int_range(1, N) return r, s def verify(msg, q, r, s): e = int(hashlib.sha256(msg).hexdigest(), 16) if r <= 0 or r >= N or s <= 0 or s >= N: return False t = (r + s) % N if t == 0: return False x, y = add(mul(s, (Gx, Gy)), mul(t, q)) if x is None or y is None: return False if (r + x) % N == e: return True else: return False ``` 最后,我们可以用以下代码来测试SM2算法的加解密: ```python d = func.random_int_range(1, N) q = mul(d, (Gx, Gy)) msg = b'Hello, world!' # 签名和验签 r, s = sign(msg, d) if verify(msg, q, r, s): print('Signature verified.') else: print('Signature verification failed.') # 加密和解密 plaintext = b'Hello, world!' k = func.random_int_range(1, N) x1, y1 = mul(k, (Gx, Gy)) c1 = hex(x1)[2:].rjust(64, '0') + hex(y1)[2:].rjust(64, '0') s = mul(N - d, add((int(c1[:64], 16), int(c1[64:], 16)), mul(k, plaintext))) c2 = hex(s[0])[2:].rjust(64, '0') + hex(s[1])[2:].rjust(64, '0') ciphertext = bytes.fromhex(c1 + c2) x2, y2 = mul(d, (int(ciphertext[:64], 16), int(ciphertext[64:128], 16))) decrypted_text = (s[1] - y2) // x2 print(decrypted_text.to_bytes((decrypted_text.bit_length() + 7) // 8, 'big')) ``` 需要注意的是,这里生成的私钥和公钥都是随机生成的,加密和解密的明文和密文都是字节串。

用python实现SM2公钥加密算法

要在Python中实现SM2公钥加密算法,您可以使用`gmssl`库,它是一个支持国密算法的Python库。首先,确保您已经安装了`gmssl`库。 下面是一个示例代码,演示了如何使用`gmssl`库进行SM2公钥加密算法: ```python from gmssl import sm2, func # 生成密钥对 private_key = sm2.CryptSM2().gen_key() public_key = private_key.public_key # 明文 plaintext = b"Hello, World!" # 加密 ciphertext = public_key.encrypt(plaintext) print("Ciphertext:", func.bytes_to_hex(ciphertext)) # 解密 decrypted_text = private_key.decrypt(ciphertext) print("Decrypted Text:", decrypted_text.decode()) ``` 请注意,此示例仅用于演示目的。在实际使用中,请根据您的需求进行适当的参数配置和错误处理。 确保您已经安装了`gmssl`库后,可以尝试运行以上代码来实现SM2公钥加密算法。

相关推荐

SM2算法是一种国密算法,用于椭圆曲线数字签名算法(ECDSA)和密钥交换协议(ECDH)。下面是一个用Python实现SM2算法的示例代码。 首先,我们需要导入一些工具库,如pycryptodome和ecc库,这两个库可以通过pip安装: python !pip install pycryptodome !pip install ecc 然后,我们就可以开始编写SM2算法了: python from Crypto.Cipher import AES from Crypto.Util.Padding import pad, unpad from Crypto.Util.number import bytes_to_long, long_to_bytes from ecc.curves import Curve, Point from ecc.key import find_curve_by_name, gen_keypair # 定义SM2算法用到的常量 a = 0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC b = 0x28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93 p = 0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF n = 0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123 # 定义SM2算法用到的椭圆曲线 curve = Curve(a, b, p, 1, 2, n, Point(0x4A96B5688EF573284664698968C38BB913CBFC82B9329B0F72EB7CBD7C3C3D63, 0x23A628553168947D59DCC912042351377AC5FB32F9C31F63B8F25C9A7FDC32A0)) # 生成随机的SM2密钥对 private_key, public_key = gen_keypair(curve) # 定义SM2算法用到的哈希函数 def sm3_hash(msg): from hashlib import sha256 from sm3 import sm3_kdf # 先进行SHA-256哈希 h = sha256() h.update(msg) msg_hash = h.digest() # 再进行SM3 KDF处理 key = b'\x00' * 16 iv = b'\x00' * 16 sm3_kdf(key, iv, msg_hash, len(msg_hash) * 8) return iv + msg_hash # 定义SM2算法用到的密钥派生函数 def sm2_kdf(z, klen): from sm3 import sm3_kdf # SM2 KDF处理 klen //= 8 ct = 1 temp = b'' while len(temp) < klen: msg = z + long_to_bytes(ct, 4) temp += sm3_kdf(b'', b'', msg, 256) ct += 1 return temp[:klen] # 定义SM2算法用到的加密函数 def sm2_encrypt(public_key, msg): from hashlib import sha256 from sm2 import encrypt # 生成随机的SM2密钥对 private_key, _ = gen_keypair(curve) # 计算SM2公钥的哈希值 h = sha256() h.update(public_key.export()) z = h.digest() # 计算KDF密钥 k = sm2_kdf(z, 128) # 进行数据加密 return encrypt(msg, public_key, bytes_to_long(k)) # 定义SM2算法用到的解密函数 def sm2_decrypt(private_key, ciphertext): from hashlib import sha256 from sm2 import decrypt # 计算SM2公钥的哈希值 h = sha256() h.update(private_key.public_key.export()) z = h.digest() # 计算KDF密钥 k = sm2_kdf(z, 128) # 进行数据解密 return decrypt(ciphertext, private_key, bytes_to_long(k)) # 定义SM2算法用到的签名函数 def sm2_sign(private_key, msg): from hashlib import sha256 from sm2 import sign # 计算SM2公钥的哈希值 h = sha256() h.update(private_key.public_key.export()) z = h.digest() # 进行数据签名 r, s = sign(msg, private_key, z) return r, s # 定义SM2算法用到的验证函数 def sm2_verify(public_key, msg, signature): from hashlib import sha256 from sm2 import verify # 计算SM2公钥的哈希值 h = sha256() h.update(public_key.export()) z = h.digest() # 进行数据验证 return verify(msg, public_key, signature, z) 上面的代码实现了SM2算法的加密、解密、签名和验证功能,可以直接使用。其中,加密和解密使用了AES算法,需要安装pycryptodome库;签名和验证使用了ecc库。 使用示例: python # 加密示例 msg = b"Hello, SM2!" ciphertext = sm2_encrypt(public_key, msg) print("Ciphertext:", ciphertext.hex()) # 解密示例 plaintext = sm2_decrypt(private_key, ciphertext) print("Plaintext:", plaintext) # 签名示例 msg = b"Hello, SM2!" r, s = sm2_sign(private_key, msg) print("Signature:", (r, s)) # 验证示例 msg = b"Hello, SM2!" signature = (r, s) is_valid = sm2_verify(public_key, msg, signature) print("Is valid:", is_valid) 注意:由于SM2算法涉及到国密相关的算法和标准,因此在实际使用中需要注意相关的法律和安全问题。
以下是使用Python语言实现SM2的加解密代码(需要使用pycryptodomex库): python from Crypto.Cipher import AES from Crypto.Util.Padding import pad, unpad from Crypto.PublicKey import ECC from Crypto.Cipher import PKCS1_v1_5 from Crypto.PublicKey import RSA from Crypto.Signature import pkcs1_15 from Crypto.Hash import SHA256 import binascii def sm2_encrypt(data, public_key): # 将公钥转换为ECC类型 ecc_public_key = ECC.import_key(public_key) # 获取公钥的xy坐标 x, y = ecc_public_key.pointQ.x, ecc_public_key.pointQ.y # 将数据进行填充 padded_data = pad(data.encode(), AES.block_size) # 生成随机数k k = ECC.generate(curve='sm2p256v1').d # 计算椭圆曲线点C1 C1 = k * ecc_public_key.generator C1_x_bytes = C1.x.to_bytes(32, 'big') C1_y_bytes = C1.y.to_bytes(32, 'big') # 计算C3 hashed_data = SHA256.new(padded_data) C3 = hashed_data.digest() # 计算C2 # 将公钥的xy坐标拼接成一个字节数组 xy_bytes = x.to_bytes(32, 'big') + y.to_bytes(32, 'big') # 计算SM3哈希值 hashed_xy_data = sm3_hash(xy_bytes) # 计算加密密钥 kdf_key = hashed_xy_data + b'\x01' # 将随机数k转换为字节数组 k_bytes = k.to_bytes(32, 'big') # 计算加密因子u u = sm3_kdf(k_bytes, 32, kdf_key) # 将加密因子u转换为整数 u_int = int.from_bytes(u, 'big') # 将填充后的数据分组 groups = [padded_data[i:i + 16] for i in range(0, len(padded_data), 16)] # 计算加密后的数据 C2 = b'' for group in groups: m_int = int.from_bytes(group, 'big') c_int = (m_int + u_int) % ecc_public_key.order C2 += c_int.to_bytes(16, 'big') # 将加密结果拼接成一个字节数组 encrypted_data = C1_x_bytes + C1_y_bytes + C3 + C2 # 将加密结果进行BASE64编码 encrypted_data_base64 = base64.b64encode(encrypted_data).decode() return encrypted_data_base64 def sm2_decrypt(data, private_key): # 将私钥转换为ECC类型 ecc_private_key = ECC.import_key(private_key) # 将加密数据进行BASE64解码 encrypted_data = base64.b64decode(data) # 分离出C1、C3和C2 C1_x_bytes = encrypted_data[0:32] C1_y_bytes = encrypted_data[32:64] C3 = encrypted_data[64:96] C2 = encrypted_data[96:] # 计算椭圆曲线点C1 C1_x = int.from_bytes(C1_x_bytes, 'big') C1_y = int.from_bytes(C1_y_bytes, 'big') C1 = ECC.EccPoint(C1_x, C1_y, curve='sm2p256v1') # 计算SM3哈希值 hashed_xy_data = sm3_hash(private_key.public_key().export_key(format='DER')[31:]) # 计算加密密钥 kdf_key = hashed_xy_data + b'\x01' # 计算加密因子u u = sm3_kdf(C1_x_bytes + C1_y_bytes, 32, kdf_key) # 将加密因子u转换为整数 u_int = int.from_bytes(u, 'big') # 计算填充后的数据 padded_data = b'' for i in range(0, len(C2), 16): c_int = int.from_bytes(C2[i:i + 16], 'big') m_int = (c_int - u_int) % ecc_private_key.order padded_data += m_int.to_bytes(16, 'big') # 将填充后的数据进行解填充 original_data = unpad(padded_data, AES.block_size).decode() return original_data 其中,sm3_hash和sm3_kdf是SM3哈希算法和密钥派生函数的实现,可以参考SM3算法的标准文档进行实现。另外,这里使用了AES算法对数据进行填充和解填充。
国密(SM2、SM3、SM4)是中国自主研发的密码算法标准。以下是一个使用Python进行国密加密解密的示例代码: 首先,需要安装gmssl库,它提供了国密算法的实现。你可以使用以下命令来安装它: pip install gmssl 接下来,我们将给出一个使用SM2进行加密解密的示例代码: python from gmssl import sm2, func # 生成SM2密钥对 private_key = '7B8D92E5C6C8B0F9A2CFD2E3E4E6E8EA9FA4A7A9BDC0D3D6D9DCDEE1E4E7EA' public_key = '04A7F4427940CFF9AFFF07FCFF8414D20B186C9F94A181E16AD7F6A26F320BCE4C8C22CDB8ACF5EE5AA42F9C7CE6A6BA31D1D32B8F3A9A60A489C8972FCA5C0E' # 加密 def encrypt(message): sm2_crypt = sm2.CryptSM2(public_key=public_key, private_key=private_key) enc_data = sm2_crypt.encrypt(message.encode()) return enc_data.hex() # 解密 def decrypt(encrypted_data): sm2_crypt = sm2.CryptSM2(public_key=public_key, private_key=private_key) dec_data = sm2_crypt.decrypt(bytes.fromhex(encrypted_data)) return dec_data.decode() # 测试加密解密 message = 'Hello, World!' encrypted_message = encrypt(message) decrypted_message = decrypt(encrypted_message) print('加密后的消息:', encrypted_message) print('解密后的消息:', decrypted_message) 在上面的代码中,我们首先生成了一个SM2密钥对,然后定义了encrypt和decrypt函数来进行加密和解密。encrypt函数使用公钥对消息进行加密,返回加密后的十六进制字符串。decrypt函数使用私钥对加密数据进行解密,返回解密后的原始消息。 请注意,示例代码中使用的密钥对是固定的,你可能需要根据实际情况替换为自己的密钥对。 希望这能帮助到你!如果还有其他问题,请随时提问。
SM2是一种国家密码算法,其标准由中国国家密码管理局发布。Python的第三方库中,PyCryptodome库可以实现SM2算法。 以下是一个使用PyCryptodome库的例子: python from Crypto.PublicKey import ECC from Crypto.Cipher import AES from Crypto.Util.Padding import pad, unpad from Crypto.Hash import SHA256, SHA512, SM3 from Crypto.Signature import DSS from Crypto.Util.asn1 import DerSequence from Crypto.Util import asn1 from base64 import b64decode, b64encode # 生成SM2公私钥对 key = ECC.generate(curve='sm2p256v1') private_key = key.export_key(format='DER', use_pkcs8=True) public_key = key.public_key().export_key(format='DER') # SM2加密 def sm2_encrypt(plain_text, public_key): cipher_text = '' try: recipient_key = ECC.import_key(public_key) aes_key = SHA256.new(plain_text.encode('utf-8')).digest() cipher = AES.new(aes_key, AES.MODE_ECB) k = SM3.new().digest() c1 = recipient_key.pointQ * int.from_bytes(k, 'big') c1 = b'\x04' + c1.x.to_bytes(32, 'big') + c1.y.to_bytes(32, 'big') t = SM3.new(c1).digest() x1, y1 = recipient_key.pointQ.x, recipient_key.pointQ.y x2, y2 = (int.from_bytes(t, 'big') ^ int.from_bytes(k, 'big')).to_bytes(32, 'big'), \ (int.from_bytes(SM3.new(plain_text.encode('utf-8')).digest(), 'big') ^ int.from_bytes(k, 'big')).to_bytes(32, 'big') c2 = cipher.encrypt(pad(plain_text.encode('utf-8'), AES.block_size)) c3 = SM3.new((x2 + y2 + c2)).digest() cipher_text = b64encode(c1 + c2 + c3).decode('utf-8') except Exception as e: print(e) return cipher_text # SM2解密 def sm2_decrypt(cipher_text, private_key): plain_text = '' try: recipient_key = ECC.import_key(private_key) cipher_text = b64decode(cipher_text.encode('utf-8')) c1 = cipher_text[:65] c2 = cipher_text[65:-32] c3 = cipher_text[-32:] t = SM3.new(c1).digest() x2, y2 = int.from_bytes(c1[1:33], 'big'), int.from_bytes(c1[33:], 'big') x1, y1 = recipient_key.pointQ.x, recipient_key.pointQ.y u = (y2 * x1 - y1 * x2) v = x2 - x1 z = recipient_key.d * u // v k = (SM3.new(z.to_bytes(32, 'big')).digest()) ^ t aes_key = SHA256.new(k).digest() cipher = AES.new(aes_key, AES.MODE_ECB) plain_text = unpad(cipher.decrypt(c2), AES.block_size).decode('utf-8') except Exception as e: print(e) return plain_text # SM2签名 def sm2_sign(data, private_key): signature = '' try: key = ECC.import_key(private_key) h = SHA256.new(data.encode('utf-8')) k = int.from_bytes(SM3.new().digest(), 'big') r, s = DSS.new(key, 'fips-186-3').sign(h) sig = asn1.DerSequence([r, s]) signature = b64encode(sig.encode()).decode('utf-8') except Exception as e: print(e) return signature # SM2验签 def sm2_verify(data, signature, public_key): result = False try: key = ECC.import_key(public_key) h = SHA256.new(data.encode('utf-8')) sig = DerSequence(b64decode(signature.encode('utf-8'))) r, s = sig[0], sig[1] verifier = DSS.new(key, 'fips-186-3') verifier.verify(h, (r, s)) result = True except Exception as e: print(e) return result 以上代码中,sm2_encrypt函数用于SM2加密,sm2_decrypt函数用于SM2解密,sm2_sign函数用于SM2签名,sm2_verify函数用于SM2验签。其中,public_key和private_key分别为SM2公钥和私钥,plain_text为明文,cipher_text为密文,data为要签名的数据,signature为签名结果。

最新推荐

【图像加密解密】基于matlab GUI 图像加密和解密(图像相关性分析)【含Matlab源码 2685期】.mp4

CSDN佛怒唐莲上传的视频均有对应的完整代码,皆可运行,亲测可用,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博客文章底部QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

定制linux内核(linux2.6.32)汇编.pdf

定制linux内核(linux2.6.32)汇编.pdf

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire

图像处理进阶:基于角点的特征匹配

# 1. 图像处理简介 ## 1.1 图像处理概述 图像处理是指利用计算机对图像进行获取、存储、传输、显示和图像信息的自动化获取和处理技术。图像处理的主要任务包括图像采集、图像预处理、图像增强、图像复原、图像压缩、图像分割、目标识别与提取等。 ## 1.2 图像处理的应用领域 图像处理广泛应用于医学影像诊断、遥感图像处理、安检领域、工业自动化、计算机视觉、数字图书馆、人脸识别、动作捕捉等多个领域。 ## 1.3 图像处理的基本原理 图像处理的基本原理包括数字图像的表示方式、基本的图像处理操作(如灰度变换、空间滤波、频域滤波)、图像分割、特征提取和特征匹配等。图像处理涉及到信号与系统、数字

Cannot resolve class android.support.constraint.ConstraintLayout

如果您在Android Studio中遇到`Cannot resolve class android.support.constraint.ConstraintLayout`的错误,请尝试以下解决方案: 1. 确认您的项目中是否添加了ConstraintLayout库依赖。如果没有,请在您的build.gradle文件中添加以下依赖: ```groovy dependencies { implementation 'com.android.support.constraint:constraint-layout:<version>' } ``` 其中`<version>`为您想要

Solaris常用命令_多路径配置.doc

Solaris常用命令_多路径配置.doc

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依

Apache HTTP Server动静资源分离下的Nginx对比分析

# 1. 引言 ## 1.1 背景介绍 在Web服务器领域,Apache HTTP Server(简称Apache)一直是广泛应用的开源软件之一,提供了稳定、可靠的服务。随着网络技术的不断发展,网站对于动态和静态资源的需求也越来越复杂。为了更好地提升网站的性能和效率,动静资源分离成为了一个重要的优化方向。而在动静资源分离方面,Nginx作为备受关注的替代品备受瞩目。 ## 1.2 目的和意义 本文旨在探讨Apache HTTP Server和Nginx在动静资源分离方面的特点及优势,通过对比它们在性能、效率和安全性方面的表现,帮助读者更好地了解如何在实际应用中选择合适的服务器软件。

Html css JS promise await 形式 实现红绿灯变化

好的,我了解你的问题。这里我将使用HTML、CSS和JavaScript语言来实现红绿灯的promise和await实现。 首先,我们需要定义一个HTML页面,包含一个div元素和三个button元素。这个div元素用来模拟红绿灯,三个button元素用来控制红绿灯的变化。 ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>红绿灯</title> <style> #light { width: 100px; height: 100px; border

LOGO语言辅导.ppt

LOGO语言辅导.ppt