Timus 1654. Cipher Message 破解密码

本文介绍了一种特殊的字符串处理方法,用于还原Stierlitz加密的消息。具体步骤包括去除重复字符对,并保留单个出现的字符。通过简洁高效的C++代码实现,解决了这一有趣而独特的挑战。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Müller tried to catch Stierlitz red-handed many times, but always failed because Stierlitz could ever find some excuse. Once Stierlitz was looking through his email messages. At that moment, Müller entered secretly and watched a meaningless sequence of symbols appear on the screen. “A cipher message,” Müller thought. “UTF-8,” Stierlitz thought.
It is known that Stierlitz ciphers messages by the following method.
  1. He deletes all spaces and punctuation marks.
  2. He replaces all successive identical letters by one such letter.
  3. He inserts two identical letters at an arbitrary place many times.
Try to restore a message as it was after the second step. For that, remove from the message all pairs of identical letters inserted at the third step.

Input

The only input line contains a message ciphered by Stierlitz. The message consists of lowercase English letters and its length is at most 200000.

Output

Output the restored message.

Sample

input output
wwstdaadierfflitzzz
stierlitz


这道题目其实十分有趣的。

如果按照原文叙述求思考,那么就很可能犯错的。

我们应该换一个角度来思考。

题目的意思就变成:

如果字符重复出现的次数是双次,那么就删除这个字符,如果出现的次数是单次,那么就保留这个字符。

这样诠释之后,题目豁然开朗,原来就是一个简单的操作字符串的问题。

这样写不会有bug。网上有些这道题目的AC程序是有bug的,应付不了所有特殊情况,不过这道题的测试用例似乎不是那么强,没有全面地测试所有特殊情况。


下面看我的程序,十分简洁明了的,速度也相当快0.04ms:

#include <string>
#include <iostream>
using namespace std;

void CipherMessage1654()
{
	string s;
	cin>>s;
	int c = 1;
	string rs;
	for (int i = 0; i < (int)s.size(); i++)
	{
		if (rs.empty() || rs.back() != s[i])
		{
			if (c % 2 == 0) rs.pop_back();			
			if (!rs.empty() && rs.back() == s[i]) c = 2;
			else
			{
				rs.push_back(s[i]);
				c = 1;
			}
		}
		else c++;
	}
	if (c % 2 == 0 && !rs.empty()) rs.pop_back();
	cout<<rs;
}

int main()
{
	CipherMessage1654();
	return 0;
}





<think>好的,我需要回答关于如何在Python中实现RSA与AES加密组合使用的问题。首先,用户提到了Crypto.Util.number中的getPrime函数、RSA和AES的CBC模式,所以需要涵盖这些部分。 首先,我应该回顾RSA和AES的基本概念。RSA是一种非对称加密算法,通常用于加密密钥或小数据,而AES是对称加密算法,适合加密大量数据。组合使用时,通常用RSA加密AES的密钥,然后用AES加密实际数据。 接下来,我需要考虑如何生成RSA密钥对。使用Crypto.Util.number.getPrime来生成大质数p和q,然后计算n=p*q,以及欧拉函数φ(n)=(p-1)*(q-1)。接着选择公钥指数e,通常为65537,并计算私钥d,即e的模逆元。这里要注意的是,PyCryptodome库中的RSA模块可能已经有生成密钥的函数,但用户可能需要手动生成,所以可能需要使用getPrime。 然后,生成AES的密钥。AES-256需要32字节的密钥,可以使用get_random_bytes来生成。之后用RSA公钥加密这个AES密钥,这样只有拥有私钥的人才能解密得到AES密钥,进而解密数据。 在加密数据时,使用AES的CBC模式。需要生成一个随机的初始化向量(IV),通常为16字节。加密过程中,PKCS7填充用于确保数据块大小正确。加密后的数据包括IV和密文,需要将它们一起传输或存储。 解密时,先用RSA私钥解密得到AES密钥,然后用该密钥和IV进行AES解密,去除填充得到明文。 需要注意的几个点:RSA加密的明文(AES密钥)长度不能超过RSA密钥的长度减去填充的开销。例如,RSA-2048可以加密最多245字节的数据,而AES-256密钥是32字节,所以没问题。另外,CBC模式需要保证IV是随机的,并且每次加密都使用不同的IV。 用户可能需要具体的代码示例,所以需要编写Python代码,使用PyCryptodome库实现上述流程。同时,代码中需要处理异常,比如解密时可能出现的填充错误,这可能是由于密钥不正确导致的。 此外,引用相关的资料,比如PyCryptodome的文档,以及之前提到的引用[2]关于getPrime函数的说明。还有引用[3]提到的欧拉函数,虽然这里可能用不到,但需要注意正确计算RSA参数。 最后,生成相关问题,可能涉及性能优化、不同加密模式的选择、错误处理等,确保覆盖用户可能感兴趣的扩展话题。</think>### RSA与AES加密组合使用的Python实现解析 #### 1. 核心思路 在混合加密中,**RSA用于加密对称密钥(如AES密钥)**,而**AES用于加密实际数据**。这种方式结合了非对称加密的安全性和对称加密的高效性。流程如下: 1. 生成RSA密钥对(公钥加密AES密钥,私钥解密) 2. 生成随机的AES密钥 3. 使用AES-CBC加密明文数据 4. 使用RSA公钥加密AES密钥 5. 传输/存储:加密后的AES密钥 + AES加密数据(含IV) --- #### 2. 代码实现(PyCryptodome库) ```python from Crypto.Cipher import AES, PKCS1_OAEP from Crypto.PublicKey import RSA from Crypto.Util.number import getPrime from Crypto.Util.Padding import pad, unpad from Crypto.Random import get_random_bytes # ========== 1. 生成RSA密钥对 ========== def generate_rsa_key(key_size=2048): p = getPrime(key_size // 2) # 引用[2]中提到的素数生成函数 q = getPrime(key_size // 2) n = p * q phi = (p-1)*(q-1) # 引用[3]欧拉函数公式 e = 65537 d = pow(e, -1, phi) # 计算模逆元 # 构建RSA密钥对象 private_key = RSA.construct((n, e, d, p, q)) public_key = private_key.publickey() return private_key, public_key # ========== 2. AES加密部分 ========== def aes_encrypt(data, aes_key): iv = get_random_bytes(16) # CBC模式需要16字节IV cipher = AES.new(aes_key, AES.MODE_CBC, iv) ciphertext = cipher.encrypt(pad(data, AES.block_size)) return iv + ciphertext # IV与密文拼接 def aes_decrypt(encrypted_data, aes_key): iv = encrypted_data[:16] ciphertext = encrypted_data[16:] cipher = AES.new(aes_key, AES.MODE_CBC, iv) return unpad(cipher.decrypt(ciphertext), AES.block_size) # ========== 3. 组合加密流程 ========== def hybrid_encrypt(data, public_key): # 生成随机AES-256密钥(32字节) aes_key = get_random_bytes(32) # 用RSA加密AES密钥 rsa_cipher = PKCS1_OAEP.new(public_key) enc_aes_key = rsa_cipher.encrypt(aes_key) # 用AES加密数据 enc_data = aes_encrypt(data, aes_key) return enc_aes_key, enc_data def hybrid_decrypt(enc_aes_key, enc_data, private_key): # 解密AES密钥 rsa_cipher = PKCS1_OAEP.new(private_key) aes_key = rsa_cipher.decrypt(enc_aes_key) # 解密数据 return aes_decrypt(enc_data, aes_key) # ====== 使用示例 ====== if __name__ == "__main__": # 生成密钥 priv_key, pub_key = generate_rsa_key() # 原始数据 plaintext = b"Secret message using RSA+AES!" # 加密 encrypted_key, encrypted_data = hybrid_encrypt(plaintext, pub_key) # 解密 decrypted_data = hybrid_decrypt(encrypted_key, encrypted_data, priv_key) print("解密结果:", decrypted_data.decode()) ``` --- #### 3. 关键点解析 1. **RSA密钥生成**:使用`getPrime`生成大素数(引用[2]),计算模数$n = p \times q$和欧拉函数$\phi(n)=(p-1)(q-1)$(引用[3]) 2. **AES-CBC模式**: - IV(初始化向量)需随机生成并附加在密文前 - 使用PKCS#7填充确保数据块对齐 3. **混合加密优势**: - RSA加密小数据(AES密钥),解决对称密钥分发问题 - AES高效加密大数据(实际消息) --- #### 4. 注意事项 - **RSA加密限制**:PKCS#1 OAEP填充要求明文长度≤密钥长度-42字节(2048位密钥最多加密245字节) - **密钥管理**:私钥需安全存储,AES密钥应为临时生成(前向保密) - **错误处理**:解密失败可能因密钥错误或填充损坏(需捕获`ValueError`) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值