11111111111111111111111111111

本文提供上海居民办理港澳通行证的详细指南,包括咨询电话、受理地点、办理时间、所需资料、办理时限、入境有效期及收费标准等内容。适用于首次申请及再次申请的情况。
上海办理港澳通行证须知






香港签证须知:
上海办理港澳通行证须知 咨询电话021-28951900

1. 受理点—上海市出入境管理局
  地址—浦东民生路1500号(近迎春路)  联系电话021-28951900
2. 办理时间
  周一至周五:上午9:00—下午4:30
  周六:上午9:00—11:30下午1:30—4:30
3. 办理时限
 申请资料齐全后,10个工作日内办结;再次申请7个工作日内办结。
4. 申办手续
  i) 提交填写完整并贴有申请人近期正面免冠彩色照片(48*33mm、背景为白色)的《上海市居民往来港澳地区申请表》和相同规格照片2张。
  ii) 申请人交验有效《居民身份证》、户口簿或者其他户籍证明原件并提交复印件(再次申请可免交);
  iii) 下列(特定身份)人员还需提交单位意见:
  (1) 在职和退(离)休的市管干部;
  (2) 各级机关包括工、青、妇等人民团体和各民主党派机关中处级领导干部;
  (3) 涉及国家政治、经济、完全、商业秘密以及金融、财税、科研、教学等机关、国有企事业单位的重点岗位工作人员;
  (4) 参照以上规定的在沪中央直属单位,外省市自治区驻沪单位的工作人员。
  特定身份人员在通行证有效期内再次申请,可免交单位意见。
5. 入境有效期
  一次入境有效访问签注,有效期为3个月,停留期为7天;
  二次入境有效访问签注,有效期为3个月,每次停留期为7天;
6. 申请人
  首次申请,申请人须亲自办理。再次申请,可委托亲属代办申请。16周岁以下和60周岁以上申请人可由亲属代办。
7. 收费标准及依据
  往来港澳通行证100元/证;一次有效签注20元/件;二次有效签注40元/件;手续费5元/人次。
如果参加旅游团,往来港澳旅游签注手续由旅行社代办。旅游签注分往返签注和单程签注两种,往返签注(即由香港去澳门再返回香港),单程签注(从香港去澳门,由澳门经珠海拱北海关回内地)。

背景:2003年以来,广东省、北京市、上海市、厦门、天津等省(自治区)、市陆续开办了"个人港澳游"。经国务院批准,石家庄、武汉、合肥市从2007年1月1日起开办"个人港澳游",居民赴港澳地区旅游更加方便。申请人只需提交身份证、户口簿,无须再提交内地或港澳地区出具的与申请事由有关的其他证明材料,也无须由旅行社组团出境。 申请《往来港澳通行证》及访问签注的详情,请联络所在地公安机关或浏览相应公安机关出入境部门的政务网站下载申请表格
你看到这样的输出: ``` key = s8$"&߄E)u/V!en10E! iv = ~V3x ``` 这说明:**`key` 和 `iv` 的内存已经被严重破坏或解码错误**。这些乱码不是有效的二进制数据,而是典型的 **Base64 解码失败、缓冲区溢出、字符串截断或编码不匹配** 导致的结果。 --- ## 🔍 根本问题分析 ### ❌ 现象解释 - `key = s8$"&߄E)...` → 这不是十六进制或原始字节,而是你用 `%s` 打印了一个非文本的二进制数组。 - `11111111111111111111111111111` → 可能是你试图调试时加的标记? - `iv = ~V3x` → 同样是乱码,说明 IV 也没正确加载。 这意味着: > ✅ 你传给 `EVP_DecryptInit_ex(ctx, NULL, NULL, key, iv)` 的 `key` 和 `iv` 是垃圾数据! → 所以调用 `EVP_DecryptUpdate` 会崩溃(段错误)! --- ## ✅ 正确做法:确保 `key` 和 `iv` 是合法的 32 字节密钥和 12 字节 IV ### 🧩 假设你的密钥文件 `/home/thn/device_shared_key.bin` 是 Base64 编码的 你应该做的是: ```c // Step 1: 从文件读取 Base64 字符串 FILE *kf = fopen("/home/thn/device_shared_key.bin", "r"); if (!kf) { perror("fopen key"); return -1; } char b64_key[64]; // Base64(32 bytes) => 最多 44 字符 + \n\0 if (!fgets(b64_key, sizeof(b64_key), kf)) { fprintf(stderr, "Failed to read key file\n"); fclose(kf); return -1; } fclose(kf); // 去掉换行符 b64_key[strcspn(b64_key, "\n\r")] = '\0'; // Step 2: Base64 解码为 32 字节原始数据 unsigned char key[32]; int decoded_len = base64_decode(b64_key, key, sizeof(key)); if (decoded_len != 32) { fprintf(stderr, "Key decode failed or wrong length: %d\n", decoded_len); return -1; } ``` --- ## ✅ 实现一个安全的 `base64_decode` ```c #include <openssl/bio.h> #include <openssl/evp.h> int base64_decode(const char *in, unsigned char *out, int out_size) { BIO *b64 = BIO_new(BIO_f_base64()); BIO *mem = BIO_new_mem_buf(in, -1); BIO_push(b64, mem); BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL); // 关键:不要换行分块 int len = BIO_read(b64, out, out_size); BIO_free_all(b64); return len > 0 ? len : -1; } ``` > ⚠️ 必须设置 `BIO_FLAGS_BASE64_NO_NL`,否则 OpenSSL 默认每 64 字符加换行,导致解码中断! --- ## ✅ 验证是否成功加载 key 不要打印成字符串!要用十六进制: ```c printf("Key (hex): "); for (int i = 0; i < 32; i++) { printf("%02x", key[i]); } printf("\n"); ``` ✅ 正确输出示例: ``` Key (hex): a1b2c3d4e5f6...1a2b3c4d ``` ❌ 错误方式(绝对禁止): ```c printf("Key (bad): %s\n", key); // key 不是以 \0 结尾的字符串! ``` → 因为你把二进制当字符串打印,C 库会一直读到第一个 `\0` 或非法地址 → 输出乱码甚至段错误! --- ## ✅ 对 IV 做同样的处理 假设你的 IV 来自某个 JSON 或配置: ```c const char *iv_b64 = "flYADzM4eKg="; // 示例 Base64 编码的 12 字节随机数 unsigned char iv[16]; // 安全起见留点空间 int iv_len = base64_decode(iv_b64, iv, sizeof(iv)); if (iv_len != 12) { fprintf(stderr, "IV must be 12 bytes long, got %d\n", iv_len); return -1; } // 打印 IV(十六进制) printf("IV (hex): "); for (int i = 0; i < iv_len; i++) { printf("%02x", iv[i]); } printf("\n"); ``` --- ## ✅ 使用 GDB 验证变量内容(在 `-g -O0` 下) ```bash gcc -g -O0 your_file.c -o app -lssl -lcrypto gdb ./app (gdb) break decrypt_aes_gcm (gdb) run (gdb) x/32bx key # 查看 key 的真实字节 (gdb) x/12bx iv # 查看 iv 的真实字节 ``` 你会看到类似: ``` 0x7ffffffee010: 0xa1 0xb2 0xc3 ... 0x4d ``` 而不是乱码字符串。 --- ## ✅ 常见错误汇总 | 错误 | 后果 | |------|------| | 用 `fread(key, 1, 32, fp)` 读文本文件 | 读的是 `'0' '1' 'a' 'b'` ASCII 码,不是原始字节 | | 用 `%s` 打印 `key` 数组 | 输出乱码,误导你认为数据“正常” | | 没检查 `base64_decode` 返回值 | 解码失败仍继续解密 | | 忘记 `BIO_FLAGS_BASE64_NO_NL` | 多行 Base64 解码只取第一行 | | `iv_len` 不等于 12 | GCM 要求必须是 12 字节 | --- ## ✅ 正确流程图 ``` [Base64 字符串] ↓ (base64_decode) [32 字节原始 key] ↓ [EVP_DecryptInit_ex(..., key, iv)] ↓ EVP_DecryptUpdate → 成功 / 失败 ``` --- ## ✅ 总结:你现在应该怎么做? | 步骤 | 操作 | |------|------| | 1 | ✅ 确保密钥文件是 **Base64 编码的 32 字节密钥** | | 2 | ✅ 使用 `base64_decode(..., BIO_FLAGS_BASE64_NO_NL)` 正确解码 | | 3 | ✅ 解码后用 `for+printf("%02x")` 打印 hex,**绝不使用 `%s`** | | 4 | ✅ 检查 `base64_decode` 返回长度是否为 32(key)和 12(iv) | | 5 | ✅ 使用 `gcc -g -O0` 编译,并用 `x/32bx key` 在 GDB 中验证 | | 6 | ✅ 添加 `ERR_print_errors_fp(stderr)` 输出 OpenSSL 内部错误 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值