




已阅读5页,还剩37页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Socket 通信及 Des 之 CBC 加密解密 目录 1.1 Socket 通信: .2 1.1.1 socket 基本概念 2 1.1.2 建立 socket 连接步骤 3 1.1.3 通信实例 .3 1.1.4 使用 Socket 应注意问题: 13 1.2 Des 之 CBC 加密解密 .13 1.2.1 DES 简单介绍 .13 1.2.2 CBC 加密实现的机理 13 1.2.3 使用 CBC 和 Base64 加密解密 关键代码 : .14 1.2.4 使用 DSE 加密解密注意问题: .24 1.3 Socket 通信及 Des 之 CBC 加密解密完整源码: 24 1.3.1 Java 服务代码: .24 1.3.2 Android 客户端代码: .31 0fa4e9f7837a0d76247aaae6d284f12d.pdf Socket 通信及 Des 之 CBC 加密解密 商业机密 第 3 页,共 42 页 1.1 Socket通信: 1.1.1 socket 基本概念 套接字(socket)是通信的基石,是支持 TCP/IP 协议的网络通信的基本操作单元。它是网络通 信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的 IP 地址, 本地进程的协议端口,远地主机的 IP 地址,远地进程的协议端口 1.1.2 建立 socket 连接步骤 I. 简单介绍: 建立 Socket 连接至少需要一对套接字,其中一个运行于客户端,称为 ClientSocket ,另 一个运行于服务器端,称为 ServerSocket 。 套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。 II. 服务器监听 服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网 络状态,等待客户端的连接请求。 III. 客户端请求 指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的 套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号, 然后就向服务器端套接字提出连接请求。 IV. 连接确认 当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接 字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认 了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他 客户端套接字的连接请求。 1.1.3 通信实例 I. Java 服务端代码 : import java.io.IOException; import .InetSocketAddress; import .UnknownHostException; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; import java.nio.charset.Charset; import java.nio.charset.CharsetDecoder; import java.util.Collection; import java.util.Hashtable; import java.util.Iterator; import java.util.Set; public class MsgServer public Selector sel = null; public ServerSocketChannel server = null; public SocketChannel socket = null; public int thisport = 4900; private String result = null; private Hashtable userlists; private SocketChannel readingsocket = null; public MsgServer() System.out.println(“Inside startserver “); public MsgServer(int port) System.out.println(“Inside startserver “); thisport = port; public void init() throws IOException, UnknownHostException System.out.println(“Inside initialization “); sel = Selector.open(); server = ServerSocketChannel.open(); server.configureBlocking(false); InetSocketAddress isa = new InetSocketAddress(“35“, thisport); server.socket().bind(isa); userlists = new Hashtable(); public void startServer() throws IOException init(); server.register(sel, SelectionKey.OP_ACCEPT); while (sel.select() 0 ) 0fa4e9f7837a0d76247aaae6d284f12d.pdf Socket 通信及 Des 之 CBC 加密解密 商业机密 第 5 页,共 42 页 Set readyKeys=sel.selectedKeys(); Iterator it=readyKeys.iterator(); while(it.hasNext() SelectionKey sk=(SelectionKey)it.next(); it.remove(); if (sk.isAcceptable() ServerSocketChannel ssc = (ServerSocketChannel)sk.channel(); socket = (SocketChannel) ssc.accept(); System.out.println(socket.toString(); /*设置为非阻塞模式*/ socket.configureBlocking(false); String socketname = socket.socket().getRemoteSocketAddress().toString(); socket.register(sel, SelectionKey.OP_READ); erestOps(SelectionKey.OP_ACCEPT); userlists.put(socketname,socket); System.out.println(socketname +“ 已经连接了! !“); if (sk.isReadable() System.out.println(“start write.“); readingsocket =(SocketChannel)sk.channel(); String ret=readMessage(readingsocket); if (ret.equalsIgnoreCase(“ has left!“) sk.cancel(); readingsocket.close(); userlists.remove(readingsocket.socket().getRemoteSocketAddress().t oString(); System.out.println(“left message:“+ret.replace(“, readingsocket.socket().getRemoteSocketAddress().toString(); sendMessage(ret.replace(“, readingsocket.socket().getRemoteSocketAddress().toString(); else if (ret.length() 0 ) /sk.cancel(); System.out.println(“send server msg:“+ret); /传回信息 sendMessage(ret); public void sendMessage(String msg) throws IOException ByteBuffer buffer = ByteBuffer.allocate(1024); buffer = ByteBuffer.wrap(msg.getBytes(); / ByteBuffer buffer = ByteBuffer.wrap(msg.getBytes(“UTF- 8“); Collection channels = userlists.values(); SocketChannel sc; for (Object o : channels) sc = (SocketChannel) o; sc.write(buffer); buffer.flip(); try Thread.sleep(500); catch (InterruptedException e) e.printStackTrace(); public String readMessage(SocketChannel sc) ByteBuffer buf = ByteBuffer.allocate(1024); try sc.read(buf); buf.flip(); Charset charset = Charset.forName(“utf-8“); CharsetDecoder decoder = charset.newDecoder(); CharBuffer charBuffer = decoder.decode(buf); result = charBuffer.toString(); System.out.println(result); catch (IOException e) 0fa4e9f7837a0d76247aaae6d284f12d.pdf Socket 通信及 Des 之 CBC 加密解密 商业机密 第 7 页,共 42 页 result = “ has left!“; return result; public static void main(String args) MsgServer ms = new MsgServer(); try ms.startServer(); catch (IOException e) e.printStackTrace(); System.exit(-1); II. Android 客户端代码 : (1) 客户端(android) Activity : import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; public class MsgClient extends Activity /* 阻塞Socket客户端 */ private EditText edt; public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.main); edt=(EditText)this.findViewById(R.id.edt); Button but=(Button)this.findViewById(R.id.Button); but.setOnClickListener(new View.OnClickListener() Override public void onClick(View v) / TODO Auto-generated method stub Intent intent=new Intent(MsgClient.this,ReceiveMessage.class); String msg=edt.getText().toString(); intent.putExtra(“msg“,msg); /启动服务 MsgClient.this.startService(intent); ); (2)客户端(android)Socket 连接类: import java.io.IOException; import .InetSocketAddress; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.channels.SocketChannel; import java.nio.charset.CharacterCodingException; import java.nio.charset.Charset; import java.nio.charset.CharsetDecoder; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.app.Service; import android.content.Context; import android.content.Intent; 0fa4e9f7837a0d76247aaae6d284f12d.pdf Socket 通信及 Des 之 CBC 加密解密 商业机密 第 9 页,共 42 页 import android.os.Binder; import android.os.IBinder; import android.widget.Toast; public class ReceiveMessage extends Service private SocketChannel client=null; private InetSocketAddress isa=null; private int NOTIFICATION = R.string.local_service_connected; /private String msg=“; public void onCreate() super.onCreate(); ConnectToServer(); StartServerListener(); public void onDestroy() super.onDestroy(); DisConnectToServer(); public void onStart(Intent intent,int startId) super.onStart(intent, startId); String msg=intent.getStringExtra(“msg“); if(msg.length()0) SendMessageToServer(msg); System.out.println(“message is comming:“+msg); private void StartServerListener() / TODO Auto-generated method stub ServerListener a=new ServerListener(); a.start(); /链接服务端 public void ConnectToServer() try client=SocketChannel.open(); isa=new InetSocketAddress(“35“,4900); client.connect(isa); /client.configureBlocking(false); catch(IOException e) e.printStackTrace(); /断开服务端 private void DisConnectToServer() / TODO Auto-generated method stub try client.close(); catch(IOException e) e.printStackTrace(); public IBinder onBind(Intent intent) / String msg=intent.getStringExtra(“msg“); / System.out.println(“绑定的数据“+msg); return mBinder; 0fa4e9f7837a0d76247aaae6d284f12d.pdf Socket 通信及 Des 之 CBC 加密解密 商业机密 第 11 页,共 42 页 public class LocalBinder extends Binder ReceiveMessage getService() return ReceiveMessage.this; private final IBinder mBinder=new LocalBinder(); private void SendMessageToServer(String msg2) / TODO Auto-generated method stub try ByteBuffer bytebuf=ByteBuffer.allocate(1024); bytebuf=ByteBuffer.wrap(msg2.getBytes(“UTF-8“); client.write(bytebuf); bytebuf.flip(); catch(IOException e) e.printStackTrace(); public void shownotification(String tab) NotificationManager barmanager=(NotificationManager)getSystemService(Context.NOTIFICATION_S ERVICE); Notification msg2=new Notification(android.R.drawable.stat_notify_chat,“信息 “,System.currentTimeMillis(); PendingIntent contentIntent =PendingIntent.getActivity(this, 0,new Intent(this,MsgClient.class),PendingIntent.FLAG_ONE_SHOT); System.out.println(“服务器端发回信息了信息 :“+ contentIntent); msg2.setLatestEventInfo(this,“服务器端发回信息了“, “信息:“ +tab, contentIntent); barmanager.notify(NOTIFICATION,msg2); / Toast.makeText(ReceiveMessage.this, tab,Toast.LENGTH_SHORT).show(); / System.out.println(tab); public class ServerListener extends Thread public void run() try while(true) ByteBuffer buf=ByteBuffer.allocate(1024); client.read(buf); buf.flip(); Charset charset=Charset.forName(“utf-8“); CharsetDecoder decoder=charset.newDecoder(); CharBuffer charbuffer; charbuffer=decoder.decode(buf); String result=charbuffer.toString(); if(result.length()0) / System.out.println(“result“+“%5555“+result); shownotification(result); catch(CharacterCodingException e) e.printStackTrace(); catch(IOException e) 0fa4e9f7837a0d76247aaae6d284f12d.pdf Socket 通信及 Des 之 CBC 加密解密 商业机密 第 13 页,共 42 页 e.printStackTrace(); 1.1.4 使用 Socket 应注意问题: (1)服务端必须先与客户端运行,才能通信 (2) 客户端和服务端所使用的编码方式要相同,否则会出现乱码问题。 1.2 Des之 CBC加密解密 1.2.1 DES 简单介绍 I. DES 是一种第一次解密算法 对称加密算法就是能将数据加解密。加密的时候用密钥对数据进行加密,解密的时候 使用同样的密钥对数据进行解密。 II. 交互模型 (1)消息传递双方约定密钥,通常由消息发送方(甲方)构建密钥通知消息接收方(乙方) (2)甲方使用密钥对数据记性加密,然后将加密后的数据通过网络传送给乙方 (3)乙方接收到数据,然后使用约定的密钥对数据进行解密 1.2.2 CBC 加密实现的机理 I. 加密步骤如下: 1)首先将数据按照 8 个字节一组进行分组得到 D1D2Dn(若数据不是 8 的整数倍, 用指定的 PADDING 数据补位) 2)第一组数据 D1 与初始化向量 I 异或后的结果进行 DES 加密得到第一组密文 C1(初始化向量 I 为全零) 3)第二组数据 D2 与第一组的加密结果 C1 异或以后的结果进行 DES 加密,得到第二 组密文 C2 4)之后的数据以此类推,得到 Cn 5)按顺序连为 C1C2C3Cn 即为加密结果。 II. 解密是步骤如下: 解密时加密的逆过程 1)首先将数据按照 8 个字节一组进行分组得到 C1C2C3Cn 2)将第一组数据进行解密后与初始化向量 I 进行异或得到第一组明文 D1(注意:一 定是先解密再异或) 3)将第二组数据 C2 进行解密后与第一组密文数据进行异或得到第二组数据 D2 4)之后依此类推,得到 Dn 5)按顺序连为 D1D2D3Dn 即为解密结果。 1.2.3 使用 CBC 和 Base64 加密解密 关键代码 : I. 公共值定义 : (1)android 中 : byte key= Base64.decode(“YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4“.getBytes(),Base64.DEFAULT); byte keyiv = 1, 2, 3, 4, 5, 6, 7, 8 ; (2)JAVA 中 : byte key =Base64.decodeBase64(“YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4“.getBytes(); byte keyiv = 1, 2, 3, 4, 5, 6, 7, 8 ; II. android 加密 ByteBuffer bytebuf=ByteBuffer.allocate(1024); /msg2.getBytes(“UTF-8“) 把要发送的消息 转换成 Byte byte str5 = DesHlelper.des3EncodeCBC(key, keyiv, msg2.getBytes(“UTF-8“); / Base64.encode(str5, Base64.DEFAULT) 使用 Base64 加密 bytebuf=ByteBuffer.wrap(Base64.encode(str5, Base64.DEFAULT); client.write(bytebuf); bytebuf.flip(); III. java 解密 System.out.println(“接受客户端信息 :接收并解密客户端信息“ ); System.out.println(“send server msg:“+ret); byte dataget=ret.getBytes(“UTF-8“); try byte str6 = DesHlelper.des3DecodeCBC(key, keyiv, Base64.decodeBase64(dataget); / 相对android 解密少一个参数 Base64.DEFAULT System.out.println(new String(str6, “UTF-8“); catch (Exception e1) / TODO Auto-generated catch block e1.printStackTrace(); 0fa4e9f7837a0d76247aaae6d284f12d.pdf Socket 通信及 Des 之 CBC 加密解密 商业机密 第 15 页,共 42 页 IV. JAVA 加密: System.out.println(“服务端回复信息 :加密回复内容并发送 “); byte data=“success“.getBytes(“UTF-8“); try byte str5 = DesHlelper.des3EncodeCBC(key, keyiv, data); System.out.println(new String(Base64.encodeBase64(str5, false),“UTF-8“); sendMessage(new String(Base64.encodeBase64(str5, false),“UTF-8“); catch (Exception e) / TODO Auto-generated catch block e.printStackTrace(); V. Android 解密: try System.out.println(“-接收服务端响应信息并解密 -“); byte data=result.getBytes(“UTF-8“); byte str6 = DesHlelper.des3DecodeCBC(key, keyiv, Base64.decode(data, Base64.DEFAULT); /相对 java解密 多一个参数 Base64.DEFAULT System.out.println(new String(str6, “UTF-8“); Log.d(“result:“, new String(str6, “UTF-8“) ; shownotification(new String(str6, “UTF-8“); catch (Exception e) / TODO Auto-generated catch block e.printStackTrace(); VI. Android 加密解密助手类: mport java.security.Key; import javax.crypto.Cipher; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESedeKeySpec; import javax.crypto.spec.IvParameterSpec; import android.util.Base64; public class DesHlelper public static void main(String args) throws Exception byte key=Base64.decode(“YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4“.getBytes(),Base64.DEFAUL T); byte keyiv = 1, 2, 3, 4, 5, 6, 7, 8 ; byte data=“中国ABCabc123“ .getBytes(“UTF-8“); System.out.println(“ECB加密解密“ ); byte str3 = des3EncodeECB(key,data ); byte str4 = ees3DecodeECB(key, str3); System.out.println(new String(Base64.encode(str3, Base64.DEFAULT),“UTF-8“); System.out.println(new String(str4, “UTF-8“); System.out.println(); System.out.println(“CBC加密解密“ ); byte str5 = des3EncodeCBC(key, keyiv, data); byte str6 = des3DecodeCBC(key, keyiv, str5); System.out.println(new String(Base64.encode(str5, Base64.DEFAULT),“UTF-8“); System.out.println(new String(str6, “UTF-8“); /* * ECB加密, 不要IV * param key 密钥 0fa4e9f7837a0d76247aaae6d284f12d.pdf Socket 通信及 Des 之 CBC 加密解密 商业机密 第 17 页,共 42 页 * param data 明文 * return Base64编码的密文 * throws Exception */ public static byte des3EncodeECB(byte key, byte data) throws Exception Key deskey = null; DESedeKeySpec spec = new DESedeKeySpec(key); SecretKeyFactory keyfactory = SecretKeyFactory.getInstance(“desede“); deskey = keyfactory.generateSecret(spec); Cipher cipher = Cipher.getInstance(“desede“ + “/ECB/PKCS5Padding“); cipher.init(Cipher.ENCRYPT_MODE, deskey); byte bOut = cipher.doFinal(data); return bOut; /* * ECB解密, 不要IV * param key 密钥 * param data Base64编码的密文 * return 明文 * throws Exception */ public static byte ees3DecodeECB(byte key, byte data) throws Exception Key deskey = null; DESedeKeySpec spec = new DESedeKeySpec(key); SecretKeyFactory keyfactory = SecretKeyFactory.getInstance(“desede“); deskey = keyfactory.generateSecret(spec); Cipher cipher = Cipher.getInstance(“desede“ + “/ECB/PKCS5Padding“); cipher.init(Cipher.DECRYPT_MODE, deskey); byte bOut = cipher.doFinal(data); return bOut; /* * CBC加密 * param key 密钥 * param keyiv IV * param data 明文 0fa4e9f7837a0d76247aaae6d284f12d.pdf Socket 通信及 Des 之 CBC 加密解密 商业机密 第 19 页,共 42 页 * return Base64编码的密文 * throws Exception */ public static byte des3EncodeCBC(byte key, byte keyiv, byte data) throws Exception Key deskey = null; DESedeKeySpec spec = new DESedeKeySpec(key); SecretKeyFactory keyfactory = SecretKeyFactory.getInstance(“desede“); deskey = keyfactory.generateSecret(spec); Cipher cipher = Cipher.getInstance(“desede“ + “/CBC/PKCS5Padding“); IvParameterSpec ips = new IvParameterSpec(keyiv); cipher.init(Cipher.ENCRYPT_MODE, deskey, ips); byte bOut = cipher.doFinal(data); return bOut; /* * CBC解密 * param key 密钥 * param keyiv IV * param data Base64编码的密文 * return 明文 * throws Exception */ public static byte des3DecodeCBC(byte key, byte keyiv, byte data) throws Exception Key deskey = null; DESedeKeySpec spec = new DESedeKeySpec(key); SecretKeyFactory keyfactory = SecretKeyFactory.getInstance(“desede“); deskey = keyfactory.generateSecret(spec); Cipher cipher = Cipher.getInstance(“desede“ + “/CBC/PKCS5Padding“); IvParameterSpec ips = new IvParameterSpec(keyiv); cipher.init(Cipher.DECRYPT_MODE, deskey, ips); byte bOut = cipher.doFinal(data); return bOut; VII. JAVA 解密解密助手类 import java.security.Key; 0fa4e9f7837a0d76247aaae6d284f12d.pdf Socket 通信及 Des 之 CBC 加密解密 商业机密 第 21 页,共 42 页 import javax.crypto.Cipher; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESedeKeySpec; import javax.crypto.spec.IvParameterSpec ; public class DesHlelper /* * ECB加密 ,不要IV * param key 密钥 * param data 明文 * return Base64编码的密文 * throws Exception */ public static byte des3EncodeECB(byte key, byte data) throws Exception Key deskey = null; DESedeKeySpec spec = new DESedeKeySpec(key); SecretKeyFactory keyfactory = SecretKeyFactory.getInstance(“desede“); deskey = keyfactory.generateSecret(spec); Cipher cipher = Cipher.getInstance(“desede“ + “/ECB/PKCS5Padding“); cipher.init(Cipher.ENCRYPT_MODE, deskey); byte bOut = cipher.doFinal(data); return bOut; /* * ECB解密 ,不要IV * param key 密钥 * param data Base64编码的密文 * return 明文 * throws Exception */ public static byte ees3DecodeECB(byte key, byte data) throws Exception Key deskey = null; DESedeKeySpec spec = new DESedeKeySpec(key); SecretKeyFactory keyfactory = SecretKeyFactory.getInstance(“desede“); deskey = keyfactory.generateSecret(spec); Cipher cipher = Cipher.getInstance(“desede“ + “/ECB/PKCS5Padding“); cipher.init(Cipher.DECRYPT_MODE, deskey); byte bOut = cipher.doFinal(data); return bOut; /* * CBC加密 * param key 密钥 * param keyiv IV * param data 明文 * return Base64编码的密文 * throws Exception */ public static byte des3EncodeCBC(byte key, byte keyiv, byte data) 0fa4e9f7837a0d76247aaae6d284f12d.pdf Socket 通信及 Des 之 CBC 加密解密 商业机密 第 23 页,共 42 页 throws Exception Key deskey = null; DESedeKeySpec spec = new DESedeKeySpec(key); SecretKeyFactory keyfactory = SecretKeyFactory.getInstance(“desede“); deskey = keyfactory.generateSecret(spec); Cipher cipher = Cipher.getInstance(“desede“ + “/CBC/PKCS5Padding“); IvParameterSpec ips = new IvParameterSpec(keyiv); cipher.init(Cipher.ENCRYPT_MODE, deskey, ips); byte bOut = cipher.doFinal(data); return bOut; /* * CBC解密 * param key 密钥 * param keyiv IV * param data Base64编码的密文 * return 明文 * throws Exception */ public static byte des3DecodeCBC(byte key, byte keyiv, byte data) throws Exception Key deskey = null; DESedeKeySpec spec = new DESedeKeySpec(key); SecretKeyFactory keyfactory = SecretKeyFactory.getInstance(“desede“); deskey = keyfactory.generateSecret(spec); Cipher cipher = Cipher.getInstance(“desede“ + “/CBC/PKCS5Padding“); IvParameterSpec ips = new IvParameterSpec(keyiv); cipher.init(Cipher.DECRYPT_MODE, deskey, ips); byte bOut = cipher.doFinal(data);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 网络直播平台流量分成与电商平台合作合同
- 深海地质勘探专利许可与技术升级改造协议
- 电商企业进口退税担保及税务风险管理合同
- 古钱币鉴定设备租赁与品牌授权与售后服务协议
- 大数据技术入股合作框架协议
- 大数据股权收益权转让与数据分析合作协议
- 美团外卖平台餐饮商家线上订单处理协议
- 离婚协议在线电子签署及履行监督协议
- 工业自动化生产线传感器设备采购、安装及维护服务合同
- 介入治疗和护理
- 2025年合肥市中煤矿山建设集团安徽绿建科技有限公司招聘笔试参考题库附带答案详解
- 《基于UASB+AO工艺的屠宰污水处理工艺设计》15000字(论文)
- 2023年商务部直属事业单位招聘笔试真题
- 【MOOC】创业管理-江苏大学 中国大学慕课MOOC答案
- 施工项目部材料管理制度
- 薪酬福利经理年度述职报告
- 深邃的世界:西方绘画中的科学学习通超星期末考试答案章节答案2024年
- 2024年大学本科课程教育心理学教案(全册完整版)
- 配音基础知识课件
- 卡西欧手表EFA-120中文使用说明书
- -小学英语人称代词与物主代词讲解课件(共58张课件).课件
评论
0/150
提交评论