Yes, there is a difference between <b> and <strong>. Even <b> is considered deprecated, Yahoo still gives a higher rank to your keywords that also appear in the body copy as <b> while Google does not consider the attribute in its algorithm at all.
The <em> tag appears italicized by default, and is meant to be used for emphasis on a word or phrase. The <strong> tag appears bold by default, and is meant to be used for strong emphasis on a word or phrase. Even though these tags appear italicized or bold by default, you can use CSS to change what they look like.
The <b> and <i> tags are meant to bold and italicize purely for visual appeal, and have been deprecated in favor of CSS.
<b> is a style - we know what "bold" is supposed to look like.
<strong> however is an indication of how something should be understood. "Strong" could (and often does) mean "bold" in a browser, but it could also mean a lower tone for a speaking program like Jaws (for blind people). And strong on a Palm Pilot may be an underline (since you can't bold a bold).
HTML was never meant to be about styles. Do some searches for "Tim Berners-Lee" and "the semantic web". <strong> is semantic - it describes the text it surrounds ("this text should be stronger than the rest of the text you've displayed") as opposed to describing how the text it surrounds should be displayed ("this text should be bold").